SSL简要介绍以及Tomcat的SSL配置
SSL简要介绍
SSL是Secure Socket Layer的缩写.可以在不可信通道上安全的传输数据.SSL主要发生在应用层,如下图所示:
主要分为两层,上层包括三个子协议:SSL Handshake、SSL Change Cipher spec及SSL Alert。下层为SSL Record。
SSL Handshake
这是SSL在传输数据之前用来沟通双方所使用的加密算法或秘钥交换算法,或是在服务器和客户端之间安全地交换秘钥和及双方的身份认证等相关操作。主要流程如下图:
- 客户端向服务器发送 ClientHello消息,告诉服务器自己所支持的最高的TLS协议版本、随机数、密码算法列表及压缩方法
- 服务器向客户端发送ServerHello消息,通知客户端确定本次通信采用的SSL版本、随机数、密码算法列表及压缩方法。服务器选择的协议版本为客户端和服务器都支持的最高版本。
- 当双方知道了连接参数,服务器向客户端发送证书
- 服务器发送ServerHelloDone消息,通知客户端连接参数协商完毕,并开始进行PremasterSecret(预主**)的交换
- 当客户端验证完证书的合法性之后,随机产生一个用于后面通讯用的“对称秘钥”,这个秘钥就是PremasterSecret,然后利用服务器证书中的公钥加密PremasterSecret,向服务器发送ClientKeyExchange消息
- 客户端向服务器发送ChangeCipherSpec消息,通知服务器后续通信的数据将采用协商好的秘钥和加密算法进行加密
- 客户端计算已交互的握手信息的Hash值,利用协商好的**和加密算法加密Hash值,通过Finished消息向服务器发送加密后的Hash值。服务器利用同样的方法计算已交互的握手信息的Hash值,并与Finished消息的解密结果比较,如果两者相同,则证明**和加密算法协商成功
- 服务器向客户端发送ChangeCipherSpec消息,通知客户端后续传输将采用协商好的**和加密算法进行加密
- 服务器计算已交互的握手信息的Hash值,利用协商好的**和加密算法加密Hash值,通过Finished消息向服务器发送加密后的Hash值。客户端利用同样的方法计算已交互的握手信息的Hash值,并与Finished消息的解密结果比较,如果两者相同,则证明**和加密算法协商成功
SSL Change Cipher spec
根据在Handshake阶段中得到的通讯参数,在需要的时候,通信双方的任一方可以发送Change Cipher Spec消息,协商变更接下来会话中使用的新**。
SSL Alert
当传送双方发生错误时,用来传送双方发生的错误信息,信息包括错误严重级别和描述。
SSL Record Protocol
SSL Record Protocol(SSL记录协议)主要为信息的传输提供两个功能:保密性和完整性。保密性通过加密数据保证;完整性通过消息摘要保证。记录协议是一个基础协议,为SSL高层协议提供数据封装、压缩、加密等基本功能的支持。比如Handshake协议利用记录协议的功能在不安全的信道上交换加密参数。
记录协议所做的工作包括:
- 将应用层的数据按固定长度分块(分块长度是小于或等于214字节)
- 对分块进行压缩(这一步是可选的)
- 将分块的摘要添加到压缩后的分段后面(计算摘要的过程需要**)
- 加密第三步产生的数据包
- 给数据包添加上固定长度的SSL头。
整个过程参考下图:
Tomcat7配置SSL(JSSE)
Tomcat can use two different implementations of SSL:
the JSSE implementation provided as part of the Java runtime (since 1.4)
the APR implementation, which uses the OpenSSL engine by default.
To avoid auto configuration you can define which implementation to use by specifying a classname in the protocol attribute of the Connector.
To define a Java (JSSE) connector, regardless of whether the APR library is loaded or not do:
<!-- Define a blocking Java SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" .../>
<!-- Define a non-blocking Java SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" .../>
以上英文摘抄自tomcat的文档。
要让tomcat支持SSL,要配置tomcat的server.xml配置文件。找到一个配置SSL的<Connector>标签,将注释去掉,指定**库路径、**库密码、修改protocol、指定端口。最后配置文件看起来就像下面这样:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
clientAuth="false"
keystoreFile="xxx"
keystorePass="xxx"
maxThreads="150"
port="443"
scheme="https"
secure="true"
sslProtocol="TLS"/>
Tomcat的SSL详细配置方法在自带的文档里有。
参考资料:
http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_1-1/ssl.html
http://www.netadmin.com.tw/article_content.aspx?sn=1106140008
http://www.ehow.com/facts_7842286_ssl-change-cipher-spec-protocol.html
http://alvinhu.com/blog/2013/06/20/one-way-and-two-way-ssl-authentication/
《java加密解密艺术》.梁栋著
转载于:https://my.oschina.net/cnlw/blog/203739
推荐阅读
-
SSL简要介绍以及Tomcat的SSL配置
-
tomcat ssl配置以及CAS单点登录探究 博客分类: java综合 TomcatSQL ServerMySQLXML浏览器
-
利用keytools为tomcat 7配置ssl双向认证的方法
-
利用keytools为tomcat 7配置ssl双向认证的方法
-
Tomcat8.5配置https时包 java.lang.IllegalStateException: SSL session ID not available错误的解决
-
SSL与TLS的区别以及介绍
-
SSL在NGINX的配置方法实践无需修改tomcat和程序配置
-
Mosquitto服务器的搭建以及SSL/TLS安全通信配置 openhab raspberry-pi 眼泪成诗hocc 2016年05月07日发布 4.8k 次浏览 1、 SSL简介 SSL
-
Nginx服务器的SSL证书配置以及对SSL的反向代理配置
-
终于搞定了Windows下Tomcat Web服务器的SSL配置