1. 程式人生 > >SSL--用Tomcat伺服器配置https雙向認證過程實戰

SSL--用Tomcat伺服器配置https雙向認證過程實戰

什麼是https? 百度百科足夠解釋它:http://baike.baidu.com/view/14121.htm

概述

A、 什麼是HTTPS

在說HTTPS之前先說說什麼是HTTP,HTTP就是我們平時瀏覽網頁時候使用的一種協議。HTTP協議傳輸的資料都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私資訊非常不安全。為了保證這些隱私資料能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的資料進行加密,從而就誕生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定義在RFC 6101中,之後IETF對SSL 3.0進行了升級,於是出現了TLS(Transport Layer Security) 1.0,定義在RFC 2246。實際上我們現在的HTTPS都是用的TLS協議,但是由於SSL出現的時間比較早,並且依舊被現在瀏覽器所支援,因此SSL依然是HTTPS的代名詞,但無論是TLS還是SSL都是上個世紀的事情,SSL最後一個版本是3.0,今後TLS將會繼承SSL優良血統繼續為我們進行加密服務。目前TLS的版本是1.2,定義在RFC 5246中,暫時還沒有被廣泛的使用。


B、 Https的工作原理

    HTTPS在傳輸資料之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸資料的密碼資訊。TLS/SSL協議不僅僅是一套加密傳輸的協議,更是一件經過藝術家精心設計的藝術品,TLS/SSL中使用了非對稱加密,對稱加密以及HASH演算法。握手過程的簡單描述如下:
1.瀏覽器將自己支援的一套加密規則傳送給網站。
2.網站從中選出一組加密演算法與HASH演算法,並將自己的身份資訊以證書的形式發回給瀏覽器。證書裡面包含了網站地址,加密公鑰,以及證書的頒發機構等資訊。
3.獲得網站證書之後瀏覽器要做以下工作:
a) 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄裡面會顯示一個小鎖頭,否則會給出證書不受信的提示。

b) 如果證書受信任,或者是使用者接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
c) 使用約定好的HASH計算握手訊息,並使用生成的隨機數對訊息進行加密,最後將之前生成的所有資訊傳送給網站。
4.網站接收瀏覽器發來的資料之後要做以下的操作:
a) 使用自己的私鑰將資訊解密取出密碼,使用密碼解密瀏覽器發來的握手訊息,並驗證HASH是否與瀏覽器發來的一致。
b) 使用密碼加密一段握手訊息,傳送給瀏覽器。
5.瀏覽器解密並計算握手訊息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之後所有的通訊資料將由之前瀏覽器生成的隨機密碼並利用對稱加密演算法進行加密。
這裡瀏覽器與網站互相傳送加密的握手訊息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常的加密解密資料,為後續真正資料的傳輸做一次測試。另外,HTTPS一般使用的加密與HASH演算法如下:

非對稱加密演算法:RSA,DSA/DSS
對稱加密演算法:AES,RC4,3DES
HASH演算法:MD5,SHA1,SHA256
其中非對稱加密演算法用於在握手過程中加密生成的密碼,對稱加密演算法用於對真正傳輸的資料進行加密,而HASH演算法用於驗證資料的完整性。由於瀏覽器生成的密碼是整個資料加密的關鍵,因此在傳輸的時候使用了非對稱加密演算法對其加密。非對稱加密演算法會生成公鑰和私鑰,公鑰只能用於加密資料,因此可以隨意傳輸,而網站的私鑰用於對資料進行解密,所以網站都會非常小心的保管自己的私鑰,防止洩漏。
TLS握手過程中如果有任何錯誤,都會使加密連線斷開,從而阻止了隱私資訊的傳輸。

實踐

工具:keytool (Windows下路徑:%JAVA_HOME%/bin/keytool.exe)
環境:Windows8.1企業版、Tomcat-7.0.27、JDK1.6、IE11、Chrome

一、為伺服器生成證書

C:\Windows\system32>keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
  [Unknown]:  StoneXing
您的組織單位名稱是什麼?
  [Unknown]:  iFLYTEK
您的組織名稱是什麼?
  [Unknown]:  iFLYTEK
您所在的城市或區域名稱是什麼?
  [Unknown]:  合肥市
您所在的州或省份名稱是什麼?
  [Unknown]:  安徽省
該單位的兩字母國家程式碼是什麼
  [Unknown]:  CN
CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥市, ST=安徽省, C=CN 正確嗎?  [否]:  y

正在為以下物件生成 1,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 36,500 天):
         CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥市, ST=安徽省, C=CN
輸入<tomcat>的主密碼
        (如果和 keystore 密碼相同,按回車):
[正在儲存 D:\tomcat.keystore]

C:\Windows\system32>

“D:\tomcat.keystore”含義是將證書檔案的儲存路徑,證書檔名稱是tomcat.keystore(可自定義名稱);
“-validity 36500”含義是證書有效期,36500表示100年,預設值是90天;


二、為客戶端生成證書

1、生成客戶端證書

C:\Windows\system32>keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\client.key.p12
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
  [Unknown]:  StoneXing
您的組織單位名稱是什麼?
  [Unknown]:  iFLYTEK
您的組織名稱是什麼?
  [Unknown]:  iFLYTEK
您所在的城市或區域名稱是什麼?
  [Unknown]:  合肥
您所在的州或省份名稱是什麼?
  [Unknown]:  安徽省
該單位的兩字母國家程式碼是什麼
  [Unknown]:  CN
CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN 正確嗎?  [否]:  y

正在為以下物件生成 1,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 90 天):
         CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
[正在儲存 D:\client.key.p12]

C:\Windows\system32>

生成的兩個檔案:



2、安裝客戶端證書
雙擊客戶端證書“client.key.p12”完成匯入證書過程如下:








三、讓伺服器信任客戶端證書

1、將客戶端證書匯出為CER檔案
由於是雙向SSL認證,伺服器必須要信任客戶端證書,因此,必須把客戶端證書新增為伺服器的信任認證。因不能直接將PKCS12格式的證書庫匯入伺服器證書庫,將客戶端證書匯出為一個單獨的CER檔案
keytool -export -alias mykey -keystore D:\client.key.p12 -storetype PKCS12 -storepass password -rfc -file D:\client.key.cer
注:password為客戶端證書的密碼

C:\Windows\system32>keytool -export -alias mykey -keystore D:\client.key.p12 -storetype PKCS12 -storepass 888888 -rfc -file D:\client.key.cer
儲存在檔案中的認證 <D:\client.key.cer>

C:\Windows\system32>


2、將CER檔案匯入到伺服器的證書庫
新增為一個信任證書使用命令如下:

C:\Windows\system32>keytool -import -v -file D:\client.key.cer -keystore D:\tomcat.keystore
輸入keystore密碼:
所有者:CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
簽發人:CN=StoneXing, OU=iFLYTEK, O=iFLYTEK, L=合肥, ST=安徽省, C=CN
序列號:52e07723
有效期: Thu Jan 23 09:57:55 CST 2014 至Wed Apr 23 09:57:55 CST 2014
證書指紋:
         MD5:15:29:58:68:8D:63:E1:00:8E:E6:EC:5E:AD:23:79:38
         SHA1:B7:EF:B9:67:BD:56:95:82:3D:D8:14:0D:20:69:F0:C8:60:98:31:9A
         簽名演算法名稱:SHA1withRSA
         版本: 3
信任這個認證? [否]:  y
認證已新增至keystore中
[正在儲存 D:\tomcat.keystore]

C:\Windows\system32>


3、檢查安裝結果

通過list命令檢視伺服器的證書庫,可以看到兩個證書,一個是伺服器證書,一個是受信任的客戶端證書:
keytool -list -keystore D:\tomcat.keystore (tomcat為你設定伺服器端的證書名)。

C:\Windows\system32>keytool -list -keystore D:\tomcat.keystore
輸入keystore密碼:

Keystore 型別: JKS
Keystore 提供者: SUN

您的 keystore 包含 2 輸入

tomcat, 2014-1-23, PrivateKeyEntry,
認證指紋 (MD5): 4B:71:06:02:7C:35:F8:BF:B1:24:E2:68:8F:65:75:15
mykey, 2014-1-23, trustedCertEntry,
認證指紋 (MD5): 15:29:58:68:8D:63:E1:00:8E:E6:EC:5E:AD:23:79:38

C:\Windows\system32>


四、讓客戶端信任伺服器證書

1、把伺服器證書匯出為CER檔案
由於是雙向SSL認證,客戶端也要驗證伺服器證書,因此,必須把伺服器證書新增到瀏覽的“受信任的根證書頒發機構”。由於不能直接將keystore格式的證書庫匯入,必須先把伺服器證書匯出為一個單獨的CER檔案,使用如下命令:
keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat為你設定伺服器端的證書名)。

C:\Windows\system32>keytool -keystore D:\tomcat.keystore -export -alias tomcat -file D:\tomcat.cer
輸入keystore密碼:
儲存在檔案中的認證 <D:\tomcat.cer>

C:\Windows\system32>


2、在客戶端安裝伺服器證書
雙擊“tomcat.cer”,按照提示安裝證書,將證書填入到“受信任的根證書頒發機構”。








3、檢查安裝結果
IE -> Internet選項 -> 內容 -> 證書


五、配置Tomcat伺服器

  1. <Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"
  2.            maxThreads="150"scheme="https"secure="true"
  3.            clientAuth="false"sslProtocol="TLS"
  4.            keystoreFile="D:\\tomcat.keystore"keystorePass="888888"
  5.            truststoreFile="D:\\tomcat.keystore"truststorePass="888888"/>

注意服務端證書名保持一致
屬性說明:
clientAuth:設定是否雙向驗證,預設為false,設定為true代表雙向驗證
keystoreFile:伺服器證書檔案路徑
keystorePass:伺服器證書密碼
truststoreFile:用來驗證客戶端證書的根證書,此例中就是伺服器證書
truststorePass:根證書密碼

六、測試

https://localhost:8443/


伺服器的證書與網址不相符問題需要理解瀏覽器做了什麼:

1、瀏覽器將自己支援的一套加密規則傳送給網站。
2、網站從中選出一組加密演算法與HASH演算法,並將自己的身份資訊以證書的形式發回給瀏覽器。證書裡面包含了網站地址,加密公鑰,以及證書的頒發機構等資訊。
3、獲得網站證書之後瀏覽器要做以下工作:
      a)  驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄裡面會顯示一個小鎖頭,否則會給出證書不受信的提示。
      b)  如果證書受信任,或者是使用者接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
      c)  使用約定好的HASH計算握手訊息,並使用生成的隨機數對訊息進行加密,最後將之前生成的所有資訊傳送給網站。

引用:http://bbs.csdn.net/topics/390685015