本文參考《計算機網絡 自頂向下方法》
背景
通信的保障可以在網絡的每一層上面做,比如應用層的有安全郵件協議(PGP pretty good privacy),傳輸層的有ssl,網絡層的有IPsec。在越底層做網絡安全保障,成本就越高。
通信的4要素
- 機密性(confidentiality):僅有發送方和希望的接收方能夠理解傳輸報文的內容。做法:....
- 報文完整性(message integrity):確保通訊過程中報文內容沒有被改動。做法....
- 端點鑒別(end-point authentication):發送方與接收方都應該能證實通訊過程涉及的另一方。 做法。。。。
- 運行安全性(operational security):客戶端和服務端運行的主機是安全的。
SSL/TLS in Detail
SSL協議包括兩個子協議:SSL記錄協議和SSL握手協議,兩個協議都處於TCP之上。
SSL握手協議准許服務器端與客戶端在開始傳輸數據前能夠通過特定的加密算法相互鑒別。
SSL記錄協議主要完成分組和組合, 壓縮和解壓縮以及消息認證和加密等功能。SSL握手協議描述安全連接建立的過程, 在客戶和服務器傳送應用層數據之前, 完成加密算法、密鑰加密密鑰算法的確定以及交換預主密鑰, 最后產生相應的客戶和服務器MAC秘密、會話加密密鑰等功能。
通訊保證
SSL/TSL能保證通訊的3要素,機密性、報文完整性、端點鑒別。用到公開密鑰密碼、公開密鑰密碼、散列函數、數字簽名。想看公開密鑰、數字簽名等原理,建議讀者看《計算機網絡 自動向下方法》或者其它文章。
MS: master secret,用於對稱加密
MAC : message authentication key ,用於鑒別報文完整性。注意與鏈路層的MAC區別(媒體訪問控制)
The Handshake Protocol
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
1. Initial Client Message to Server
Client Hello.
- Version Number. 2 for SSL 2.0 ; 3 for SSL 3.0 ;3.1 for TLS.
- Randomly Generated Data. 隨機碼,用於生成MS(master secret)和MAC密鑰
- Session Identification (if any). 有或者無,有則客戶端傳上一次session的id可以恢復session
- Cipher Suite. 客戶端支持的密碼算法列表,供服務器選擇
- Compression Algorithm. 客戶端支持的壓縮算法列表,供服務器選擇
例子:
ClientVersion 3,1
ClientRandom[32]
SessionID: None (new session)
Suggested Cipher Suites:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_DES_CBC_SHA
Suggested Compression Algorithm: NONE
2. Server Response to Client
-
Server Hello.
- Version Number. 服務器選擇的版本
- Randomly Generated Data. 隨機碼,用於生成MS(master secret)和MAC鑒別碼。此時服務端已經可以生成自己的MS,(master secret)后面會對比客戶端生成的M,用於會話加密,是對稱的。MAC密鑰用於鑒別報文完整性。
- Session Identification (if any). 有3種情況,1無:說明這次是新session;2新的,表明是新session,可能是服務器恢復舊session失敗導致;3舊的:服務器恢復session成功,這個id與客戶端給的一樣。
- Cipher Suite. 服務端選擇的密鑰算法
- Compression Algorithm. 服務端選擇的壓縮算法
-
Server Certificate. 服務端的公鑰證書,包含公鑰
-
Server Key Exchange. 通常沒有,可選的,是一個暫時用於加密客戶端發送的信息。僅僅用於服務端的公鑰無法對信息加密
-
Client Certificate Request. 請求客戶端的公鑰,可選的。
-
Server Hello Done. 說明hello結束,等待客戶端回應。
server hello例子
Version 3,1
ServerRandom[32]
SessionID: bd608869f0c629767ea7e3ebf7a63bdcffb0ef58b1b941e6b0c044acb6820a77
Use Cipher Suite:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
Compression Algorithm: NONE
3. Client Response to Server
- Client Certificate. 發送客戶端公鑰
- Client Key Exchange. 證書沒問題,用雙方選擇的隨機碼生成pre-master secret,用服務端公鑰加密后發送,用於會話加密,是對稱密鑰。
- Certificate Verify. 僅當客戶端發送的自己公鑰時會有。數字簽名,客戶端用自己私鑰加密,服務端用客戶端給的公鑰解密,做端點鑒別。
- Change Cipher Spec. 告訴服務端已經用協商好的算法加密信息。
- Client Finished. 一段用服務端公鑰以及加密信息的hash,如果服務端能解開,說明沒問題
4. Server Final Response to Client
- Change Cipher Spec Message. 告訴客戶端已經用協商好的算法加密信息
- Server Finished Message.
握手小結
經過上面握手,客戶端與服務端都互相確認了身份,並且能夠私密傳輸信息。其中服務端和客戶端的公鑰私鑰是用於保證傳輸的隨機碼加密還有身份確認。當保證了隨機碼的加密傳輸,那就可以保證后來用於通訊的對稱密鑰的正確。最終雙方共享着MS和MAC密鑰
數據傳輸
握手之后,客戶端和服務端都有了MS和MAC,他們能夠通過TCP連接開始安全通訊。既然SSL/TSL是基於TCP,一種自然的思路是在TCP數據傳輸完之后再對數據進行驗證,但如果發現有問題則可能需要重傳所有數據。
其實SSL還會對數據進行分段,設信息是m,每一段信息加上MAC用於完整性檢測,所以是(m,MAC);設對稱密鑰簡稱是s(不是ms,是MAC密鑰),MAC = H(m+s)。這樣服務端收到的是(m,H(m+s)),它通過m和s重新計算出H(m+s)與接收到的H(m+s)對比,就知道報文完整性。
應用場景
- 常見的電子網站
- 遠程控制
- 數據庫連接
- 郵件
小結
總的來說SSL具有強大的安全性能, 無需客戶端安裝額外的軟件, 使用十分方便。目前應用中的SSL加密大部分只使用了單向認證, 為了提供全面的安全性, 雙向認證必然會是SSL應用發展的一個趨勢。