Tomcat中的ssl安全信道的实现
为了实现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安全信道的实现的更多相关文章
- 在tomcat中加入SSL腾讯云证书的步骤
在tomcat中加入SSL证书,可以用https方式访问域名,增加域名的安全性.当然也有很多应用要求https访问,也是安全性的考虑.阿里云和腾讯云都提供SSL证书,还有一些其他的大公司也提供,我这里 ...
- 在 Tomcat 中配置 SSL/TLS 以支持 HTTPS
本件详细介绍了如何通过几个简单步骤在 Tomcat 中配置 SSL/TLS .使用 JDK 生成自签名的证书,最终实现在应用中支持 HTTPS 协议. 生产密钥和证书 Tomcat 目前只能操作 JK ...
- tomcat中配置ssl的http协议
问题: IDEA配置tomcat后运行时报如下错误: Error running wis-client-web: SSL HTTP Connector node not found: set up o ...
- RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识
情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...
- Tomcat中的Session小结
什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...
- CAS 在 Tomcat 中实现单点登录
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统 中,用户只需要登录一次就可以访问所有相互信任的应用系统.CA ...
- 【IBM】使用 CAS 在 Tomcat 中实现单点登录
来源: IBM Developer http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/ 张 涛 (zzhangt@cn.ibm.com ...
- 使用 CAS 在 Tomcat 中实现单点登录
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS ...
- 用JAX-WS在Tomcat中公布WebService
JDK中已经内置了Webservice公布,只是要用Tomcat等Webserver公布WebService,还须要用第三方Webservice框架. Axis2和CXF是眼下最流行的Webservi ...
随机推荐
- linux必知必会命令
- Spring Boot简单应用——会员管理系统
简介 本项目是使用Spring Boot编写的一个简单的会员管理系统. 提供了会员的解决方案,主要有会员模块,管理员模块,礼品模块,商品模块,会员等级模块,生日提醒模块,积分模块,详细模块如下图 准备 ...
- Git的安装和使用(托管至GitHub的方法)
一.下载Git 1.下载 下载地址: https://git-scm.com/download/win 根据你的操作系统选择32位或者64位 2.安装过程一路next 3.检验安装是否成功 在桌面点击 ...
- 计蒜客NOIP模拟赛(2) D2T1 劫富济贫
[问题描述] 吕弗·普自小从英国长大,受到骑士精神的影响,吕弗·普的梦想便是成为一位劫富济贫的骑士. 吕弗·普拿到了一份全国富豪的名单(不在名单上的都是穷人),上面写着所有富豪的名字以及他们的总资产, ...
- bzoj 1426:收集邮票 求平方的期望
显然如果收集了k天,ans=k*(k+1)/2=(k^2+k)/2.那么现在要求的就是这个东西的期望. 设f[i]表示已有i张邮票,收集到n张的期望次数,g[i]表示已有i张邮票,收集到n张的次数的平 ...
- SPOJ Coconuts 最大流 最小割
A group of n castle guards are voting to determine whether African swallows can carry coconuts. Whil ...
- Uva 437 巴比伦塔 && UVA10003
要求底面严格小于它下方立方体的长宽,求出最高情况,一块石头可以多次使用 用结构体记录一块石头的三种放置情况,按面积排序. dp[i] = max(dp[i],dp[j] + block[i].high ...
- bzoj1071[SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2472 Solved: 792[Submit][Status][ ...
- 存储单位的换算(KB, MB, GB)
关于存储单位的换算,大家一般会想到下面的换算方法. 1GB=1024MB 1MB=1024KB 1kb=1024字节 但实际生活中,这种换算方法并不准确. 例如在商家生产销售的硬盘, U盘中就不是这样 ...
- 《Java技术》第三次作业
(一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Gr ...