SSL簡要介紹以及Tomcat的SSL配置

SSL簡要介紹

SSL是Secure Socket Layer的縮寫.能夠在不可信通道上安全的傳輸數據.SSL主要發生在應用層,以下圖所示: html

主要分爲兩層,上層包括三個子協議:SSL Handshake、SSL Change Cipher spec及SSL Alert。下層爲SSL Record。 java

SSL Handshake

這是SSL在傳輸數據以前用來溝通雙方所使用的加密算法或祕鑰交換算法,或是在服務器和客戶端之間安全地交換祕鑰和及雙方的身份認證等相關操做。主要流程以下圖: web


  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

當傳送雙方發生錯誤時,用來傳送雙方發生的錯誤信息,信息包括錯誤嚴重級別和描述。 apache

SSL Record Protocol

SSL Record Protocol(SSL記錄協議)主要爲信息的傳輸提供兩個功能:保密性和完整性。保密性經過加密數據保證;完整性經過消息摘要保證。記錄協議是一個基礎協議,爲SSL高層協議提供數據封裝、壓縮、加密等基本功能的支持。好比Handshake協議利用記錄協議的功能在不安全的信道上交換加密參數。 tomcat

記錄協議所作的工做包括: 安全

  1. 將應用層的數據按固定長度分塊(分塊長度是小於或等於214字節)
  2. 對分塊進行壓縮(這一步是可選的)
  3. 將分塊的摘要添加到壓縮後的分段後面(計算摘要的過程須要密鑰)
  4. 加密第三步產生的數據包
  5. 給數據包添加上固定長度的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" .../>
less

以上英文摘抄自tomcat的文檔。 ide

要讓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加密解密藝術》.樑棟著

相關文章
相關標籤/搜索