欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SSL简要介绍以及Tomcat的SSL配置

程序员文章站 2024-03-24 22:57:52
...

SSL简要介绍

SSL是Secure Socket Layer的缩写.可以在不可信通道上安全的传输数据.SSL主要发生在应用层,如下图所示:

SSL简要介绍以及Tomcat的SSL配置

主要分为两层,上层包括三个子协议:SSL Handshake、SSL Change Cipher spec及SSL Alert。下层为SSL Record。

SSL Handshake

这是SSL在传输数据之前用来沟通双方所使用的加密算法或秘钥交换算法,或是在服务器和客户端之间安全地交换秘钥和及双方的身份认证等相关操作。主要流程如下图:

SSL简要介绍以及Tomcat的SSL配置


  1. 客户端向服务器发送 ClientHello消息,告诉服务器自己所支持的最高的TLS协议版本、随机数、密码算法列表及压缩方法
  2. 服务器向客户端发送ServerHello消息,通知客户端确定本次通信采用的SSL版本、随机数、密码算法列表及压缩方法。服务器选择的协议版本为客户端和服务器都支持的最高版本。
  3. 当双方知道了连接参数,服务器向客户端发送证书
  4. 服务器发送ServerHelloDone消息,通知客户端连接参数协商完毕,并开始进行PremasterSecret(预主**)的交换
  5. 当客户端验证完证书的合法性之后,随机产生一个用于后面通讯用的“对称秘钥”,这个秘钥就是PremasterSecret,然后利用服务器证书中的公钥加密PremasterSecret,向服务器发送ClientKeyExchange消息
  6. 客户端向服务器发送ChangeCipherSpec消息,通知服务器后续通信的数据将采用协商好的秘钥和加密算法进行加密
  7. 客户端计算已交互的握手信息的Hash值,利用协商好的**和加密算法加密Hash值,通过Finished消息向服务器发送加密后的Hash值。服务器利用同样的方法计算已交互的握手信息的Hash值,并与Finished消息的解密结果比较,如果两者相同,则证明**和加密算法协商成功
  8. 服务器向客户端发送ChangeCipherSpec消息,通知客户端后续传输将采用协商好的**和加密算法进行加密
  9. 服务器计算已交互的握手信息的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协议利用记录协议的功能在不安全的信道上交换加密参数。

记录协议所做的工作包括:

  1. 将应用层的数据按固定长度分块(分块长度是小于或等于214字节)
  2. 对分块进行压缩(这一步是可选的)
  3. 将分块的摘要添加到压缩后的分段后面(计算摘要的过程需要**)
  4. 加密第三步产生的数据包
  5. 给数据包添加上固定长度的SSL头。

整个过程参考下图:

SSL简要介绍以及Tomcat的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就可以通过https访问tomcat了。
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