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内核设计剖析》

时间: 2024-09-17 04:56:12

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

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

本件详细介绍了如何通过几个简单步骤在 Tomcat 中配置 SSL/TLS .使用 JDK 生成自签名的证书,最终实现在应用中支持 HTTPS 协议. 生产密钥和证书 Tomcat 目前只能操作 JKS.PKCS11.PKCS12 格式的密钥存储库.JKS 是 Java 标准的"Java 密钥存储库"格式,是通过 keytool 命令行工具创建的.该工具包含在 JDK 中.PKCS12 格式一种互联网标准,可以通过 OpenSSL 和 Microsoft 的 Key-Manager 来

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

CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特点: 开源的企业级单点登录解决方案. CAS Server 为需要独立部署的 Web 应用. CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等. CAS 原理和协议

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

来源: IBM Developer http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/ 张 涛 (zzhangt@cn.ibm.com), 软件工程师, IBM 王 秉坤 (wangbk@cn.ibm.com), 软件工程师, IBM  简介: 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用

在Tomcat中使用Yale CAS实现单点登陆(SSO)

<!--[if !supportEmptyParas]--> <!--[endif]--> 耶鲁大学开发的单点登录系统称为CAS(Central Authentication Server)被设计成一个独立的Web应用程序(cas.war).它目前用几个Java Servlet作为实现并且通过一个Https服务器来运行.要使用单点登陆功能的Web应用作为CAS的一个客户端来运行. 由于CAS使用Https协议,所以首先要知道如何在容器中配置SSL.Tomcat的SSL配置相对其它的

jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表

问题描述 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4__JOB表,_这是正常现象吗,应该这么解决呢????求解答 解决方案 http://download.csdn.net/detail/freedomky/4300308 是不是有业务需要重复执行. 解决方案二: 不会呀 我只整合好了SSH还没什么都没做呢 知识启动了tomcat 我的applicationContext.xml:

电脑中通过修改无线路由信道提高网速的方法

电脑中通过修改无线路由信道提高网速的方法          1.在浏览器中输入路由器管理界面地址(路由器背面有标注),并登录(路由器背面有标注); 2.点击"无线设置"-"基本设置"; 3.在"信道"右侧的下拉菜单中选择选择6或11,因为这两个信道不会受到其他无线设备的互相干扰,点击保存即可; 4.设置之后可以看到网速确实快起来了. 以上介绍的便是在电脑中通过修改无线路由信道提高网速的方法.

JNDI简介,jndi在tomcat中的配置,jdbc api简介,java连接数据库服务

连接数据库 JNDI(Java 命名和目录接口)   JNDI(Java 命名和目录接口) 分布式计算环境通常使用命名和目录服务来获取共享的组件和资源.命名和目录服务将名称与位置.服务.信息和资源关联起来.  命名服务提供名称-对象的映射.目录服务提供有关对象的信息,并提供定位这些对象所需的搜索工具.有许多命名和目录服务实现,并且到它们的接口是不同的. Java 命名和目录接口或 JNDI 提供了一个用于访问不同的命名和目录服务的公共接口.请参阅 URL java.sun.com/product

Tomcat中如何设置项目为默认项目

项目的实际使用中经常需要将当前项目设为tomcat的默认项目,而不是进入到tomcat的页面,有几种方法可以实现,注意第二种.第三种情况需要先删除webapps下的ROOT目录,否则会失败. 一.将自己的项目改名为ROOT注意项目名称要大写 如果改完后没生效,建议清空tomcat中的work目录(缓存) 二.修改配置文件server.xml 增加<Context path="" docBase="Cluster" debug="0" rel

部署项目-tomcat中启动应用耗时长

问题描述 tomcat中启动应用耗时长 每次myeclipse部署项目后,启动需要几十秒,项目是ssh的.请问有什么办法加快么,或者通过什么方法可以监控耗时都在哪? 解决方案 清理一下里面的应用,手工启动一下tomcat,看一下时间都花费在哪里了,正常的话,应该几秒就搞定了