为了实现https协议通信,tomcat需要利用JSSE把SSL/TLS协议集成到自身系统上,通过上一节我们知道不同的厂商可以实现自己的JSSE,而tomcat默认使用的是以前sun公司开发实现的包而且由JDK自带。

Tomcat实现http及https通信的基础是什么?其实http与https的不同就是在创建通信套接字服务器时的不同,http是没有任何加密措施的套接字服务器,而https是靠嵌套了一层密码机制的套接字服务器。在实现时只需根据实际通信情况创建对应的套接字服务器,这时你应该果断想起工厂类,由各自工厂负责创建及初始化套接字服务器。看图3-1-7-4,在tomcat启动初始化时其中一个组件JIoEndpoint也会跟着初始化,届时它将根据配置文件的SSL标识来决定创建ServerSocket还是SSLServerSocket。如果是http协议则使用DefaultServerSocketFactory完成套接字服务器创建,反之,如果是https协议则要通过SSLImplementation间接定位到JSSESocketFactory,由它完成套接字服务器的创建。

 

图3-1-7-4 http与https套接字工厂类

关于http协议使用的套接字这里我们并不关心,重点研究下https协议使用的安全套接字的生成及相关操作,具体由JSSESocketFactory实现,此工厂类扩展了两个接口,其中ServerSocketFactory接口定义创建套接字、开始接受套接字、握手等方法,另外的SSLUtil接口则定义了一些SSL相关对象(例如SSL上下文、密钥管理器、信任管理器等)的操作方法。在tomcat启动时将通过createSocket方法创建安全套接字服务器,如下

public ServerSocket createSocket (int port) throws IOException{

        init();

        ServerSocket socket = sslProxy.createServerSocket(port);

        initServerSocket(socket);

        return socket;

    }

首先,init()方法作为初始化方法进行一些初始化操作,包括创建SSL上下文、利用密钥管理器和信任管理器初始化SSL上下文、设置SSL会话、检测SSL配置是否OK等等,经过上一节的学习,这一系列操作相信大家都比较熟悉了,都是JSSE API的一些操作。接着,通过sslProxy创建SSLServerSocket,sslProxy其实是SSLServerSocketFactory类的实例,此类属于JSSE API的核心类,不必往下追究createServerSocket的详细实现。然后,通过initServerSocket方法对刚刚创建的SSLServerSocket做一些初始化操作,包括设置可用的加密套件、设置可用的协议、设置是否需要客户端提供身份验证等等。最后,返回SSLServerSocket对象,即安全套接字服务器对象。

除了createSocket方法之外,JSSESocketFactory还有几个重要的方法需要说明一下:

① handshake方法,它负责执行SSL握手,一般握手可以通过SSLSocket的startHandshake()方法或getSession()方法实现,startHandshake是一种显式的调用,它将使会话使用心得密钥、新的加密套件。而getSession则是一种隐式的调用,它会判断当前是否存在有效会话,如果没有则尝试建立会话。JSSESocketFactory的handshake方法选择通过getSession方法隐式实现。

② getKeystorePassword方法,它负责获取密钥存储器密码,tomcat将密码默认设为“changeit”,在实际运行中,如果server.xml的connector节点配置了keystorePass,则密码为这个keystorePass,如果配置了keyPass而没有配置keystorePass则密码为keyPass,否则最后才是使用默认密码“changeit”。

③ getKeystore方法,它负责读取密钥存储器,密钥存储器的默认文件路径是System.getProperty("user.home")即用户目录下的.keystore文件,如果server.xml的connector节点配置了keystoreFile,则路径为指定的keystoreFile,否则使用默认路径。

④ checkConfig方法,它负责检查证书与启用的密码套件是否兼容,主要是为了解决编号为45528的bug,检测的方法比较巧妙,创建了一个没有绑定任何端口的SSLServerSocket对象,超时设置为1毫秒,接着调用accept方法,一毫秒后肯定会抛出一个异常,因为绑定端口肯定不会被客户端连上,1毫秒后肯定会超时,所以它有两种可能,一种是证书与密码套件有兼容问题则会抛出SSLException异常,另外一种则是抛出超时异常。根据不同异常处理即可。

经过上一节的JSSE学习后,这节关于tomcat的ssl安全信道实现则很好理解,无非就是把JSSE的接口集成到tomcat的核心程序中。

Tomcat中的ssl安全信道的实现的更多相关文章

  1. 在tomcat中加入SSL腾讯云证书的步骤

    在tomcat中加入SSL证书,可以用https方式访问域名,增加域名的安全性.当然也有很多应用要求https访问,也是安全性的考虑.阿里云和腾讯云都提供SSL证书,还有一些其他的大公司也提供,我这里 ...

  2. 在 Tomcat 中配置 SSL/TLS 以支持 HTTPS

    本件详细介绍了如何通过几个简单步骤在 Tomcat 中配置 SSL/TLS .使用 JDK 生成自签名的证书,最终实现在应用中支持 HTTPS 协议. 生产密钥和证书 Tomcat 目前只能操作 JK ...

  3. tomcat中配置ssl的http协议

    问题: IDEA配置tomcat后运行时报如下错误: Error running wis-client-web: SSL HTTP Connector node not found: set up o ...

  4. RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

      情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

  5. Tomcat中的Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...

  6. CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统 中,用户只需要登录一次就可以访问所有相互信任的应用系统.CA ...

  7. 【IBM】使用 CAS 在 Tomcat 中实现单点登录

    来源: IBM Developer http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/ 张 涛 (zzhangt@cn.ibm.com ...

  8. 使用 CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS ...

  9. 用JAX-WS在Tomcat中公布WebService

    JDK中已经内置了Webservice公布,只是要用Tomcat等Webserver公布WebService,还须要用第三方Webservice框架. Axis2和CXF是眼下最流行的Webservi ...

随机推荐

  1. Redis常用命令--Hashes

    Hash是由键值对组成的map.Hashes的底层是通过字典实现的.一个哈希表里面可以有多个哈希表节点.而每个哈希节点就保存了字典中的一个键值对. 字典是一种用于保存键和值对的抽象数据结构.字典里的每 ...

  2. Lazy Loading | Explicit Loading | Eager Loading in EntityFramework and EntityFramework.Core

    EntityFramework Eagerly Loading Eager loading is the process whereby a query for one type of entity ...

  3. 【网络流】【BZOJ1006】【SCOI2007】蜥蜴

    学弟@lher在周末训练赛中出的题目的原题(这个人拿省选题来当作提高组模拟,太丧了...) 题意简析:看题目:) 解题思路:题目显然是最大流. 首先拆点将点权变为边权,然后按照题意对于所有有跳板的点向 ...

  4. hdu 5445 多重背包

    Food Problem Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  5. 决战 状压dp

    决定在这个小巷里排兵布阵.小巷可以抽象成一个们彼此之间并不是十分和♂谐.具体来说,一个哲学家会有一个的矩形.每一位哲学家会占据一个格子.然而哲学家的01矩阵来表示他自己的守备范围.哲学家自己位于这个矩 ...

  6. poj 3335 Rotating Scoreboard(半平面交)

    Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6420   Accepted: 25 ...

  7. ZOJ 3228 Searching the String(AC自动机)

    Searching the String Time Limit: 7 Seconds      Memory Limit: 129872 KB Little jay really hates to d ...

  8. hihocoder #1159 : 扑克牌

    描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中 ...

  9. poj3580 splay树 REVOVLE循环

    SuperMemo Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12795   Accepted: 3989 Case T ...

  10. C语言程序设计第五次作业——循环结构

    (一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...