为了实现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. hosts管理工具1.0发布了。。。。

    hosts管理工具1.0发布了.... 可以快速管理hosts文件了,再也不用打开系统盘,一个目录一个目录的查找了. 快速方便的修改host文件,一键保存. 可快速注释当前行,或者取消注释当前行,只需 ...

  2. SpringIOC学习二

    Spring的IOC容器通过依赖注入DI(dependency injection)来实现程序之间的依赖关系,达到解耦的方式依赖的方式:a.基于xml文件配置的注入    * 构造函数注入    * ...

  3. 有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

    <Deep Learning>(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(ove ...

  4. Mac 下升级 vim 并自己配置 vim 的过程

    1.升级 vim 我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim -- ...

  5. 关于sg90舵机的,要知道!要注意!

    这类舵机的转向跟频率和占空比相关,两者缺一不可! 1.在一个特定的频率下,特定的占空比使得舵机会转到一个角度,占空比不变,则角度不会不会变化,所以想要舵机动,就要在国定的频率下不断改变占空比. 2.当 ...

  6. [COGS 2401]Time is Money

    Description 题库链接 给你 \(n\) 个节点 \(m\) 条边的无向连通图.每条边有两个权值 \(c,t\) ,要你生成一棵边集为 \(\mathbb{E}\) 的生成树使得 \[\su ...

  7. TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame

    传送门:https://284914869.github.io/AEoj/558.html 题目简述  一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子.  这个 ...

  8. 【集训第三天·疯狂训练】哦,顺带学习了manacher

    虽然说是疯狂训练吧,但是也没写多少题,就把伸展树的操作熟悉了一下,ac了5个题目. 一整天没啥可吐槽的,除了昨天在机房打游戏的某位朋友翻车后和教练谈了谈心2333 说题吧.. 1.BZOJ1208 H ...

  9. Delphi7.0常用函数-属性-事件

    abort 函数 引起放弃的意外处理 addexitproc 函数 将一过程添加到运行时库的结束过程表中 addr 函数 返回指定对象的地址 adjustlinebreaks 函数 将给定字符串的行分 ...

  10. python2.7练习小例子(二)

        2):题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...