为了实现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. “百度杯”CTF比赛 九月场_Code(PhpStorm)

    题目在i春秋ctf大本营 打开链接是一张图片,审查元素发现关键词base64,图片的内容都以base64加密后的形式呈现,查看url形式,应该是一个文件读取的漏洞 这里我们可以采用url/index. ...

  2. 推荐一个c++小巧开源且跨平台的图像解码库

    该图像解码库仅仅三个文件. 图像处理封装: spot.cpp spot.h 解码库实现: spot.c 支持图片文件格式如下: File format Read Write BMP files yes ...

  3. 洛谷P1593 因子和

    题目描述 输入两个正整数a和b,求a^b的因子和.结果太大,只要输出它对9901的余数. 输入输出格式 输入格式: 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式: a^b的因 ...

  4. 【LSGDOJ 1850】滑雪课程

    题目描述 贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 D i 分钟,要 ...

  5. Java Servlet 笔记4

    Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的. 读取 HTTP 头的 ...

  6. C语言程序设计预备作业。

    1. 阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:我理想中的师生关系是Coach/Trainee(健身教练/健身学员)的关系.因为邹老师就如同 ...

  7. c语言第五次作业0

    ---恢复内容开始--- (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如 ...

  8. 如何用git命令生成Patch和打Patch

    在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情.什么是patch?简单来讲,patch中存储的是你对代码的修改,生成patch就是记录 ...

  9. js数组求差集

    var arr1 = [2,3,5,88,99,444,66];var arr2 = [2,88,66]; arr_dive(arr1,arr2); function arr_dive(aArr,bA ...

  10. JMQ

    [京东技术]京东的MQ经历了JQ->AMQ->JMQ的发展,其中JQ的基于关系数据库,严格意义上讲称不上消息中间件,JMQ的存储是JFS和HBase,AMQ即ActiveMQ,本文说说JM ...