SSL協議會話建立過程解析

SSL協議縮寫Secure SocketLayer,是一種制定的保證服務器和客戶端安全通信的一種協議。最初是由Netscape 在1996年發佈,由於一些安全的原因SSL v1.0和SSL v2.0都沒有公開,直到1996年的SSL v3.0。TLS是SSL v3.0的升級版,目前市面上所有的HTTPS都是用的是TLS,而不是SSL。本文主要分析和講解TLS。

HTTPS(Hyper TextTransfer Protocol over Secure Socket Layer),是一種基於SSL/TLS的HTTP,所有的HTTP數據都是在SSL/TLS協議封裝之上傳輸的。HTTPS協議在HTTP協議的基礎上,添加了SSL/TLS握手以及數據加密傳輸,也屬於應用層協議。所以,研究HTTPS協議原理,最終其實是研究SSL/TLS協議。

下面就結合HTTPS來說明一下TLS

TLS的握手階段是發生在TCP握手之後。握手實際上是一種協商的過程,對協議所必需的一些參數進行協商。TLS握手過程分爲四步,過程如下:

20180110212939784820.gif

一、客戶端發起請求

由於客戶端(如瀏覽器)對一些加解密算法的支持程度不一樣,但是在TLS協議傳輸過程中必須使用同一套加解密算法才能保證數據能夠正常的加解密。在TLS握手階段,客戶端首先要告知服務端,自己支持哪些加密算法,所以客戶端需要將本地支持的加密套件(Cipher Suite)的列表傳送給服務端。除此之外,客戶端還要產生一個隨機數,這個隨機數一方面需要在客戶端保存,另一方面需要傳送給服務端,客戶端的隨機數需要跟服務端產生的隨機數結合起來產生後面要講到的Master Secret。

二、服務端回覆客戶端

服務端在接收到客戶端的請求之後,服務端需要從中選出一組加密算法與HASH算法,並將自己的身份信息以證書的形式發回給瀏覽器。證書裏面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。這個證書是對於服務端的一種認證。證書是需要申請,並由專門的數字證書認證機構(CA)通過非常嚴格的審覈之後頒發的電子證書。頒發證書的同時會產生一個私鑰公鑰。私鑰由服務端自己保存,不可泄漏。公鑰則是附帶在證書的信息中,可以公開的。證書本身也附帶一個證書電子簽名,這個簽名用來驗證證書的完整性和真實性,可以防止證書被串改。另外,證書還有個有效期。

在服務端向客戶端發送的證書中沒有提供足夠的信息的時候,還可以向客戶端發送一個Server Key Exchange。

此外,對於非常重要的保密數據,服務端還需要對客戶端進行驗證,以保證數據傳送給了安全的合法的客戶端。服務端可以向客戶端發出Cerficate Request消息,要求客戶端發送證書對客戶端的合法性進行驗證。

跟客戶端一樣,服務端也需要產生一個隨機數發送給客戶端。客戶端和服務端都需要使用這兩個隨機數來產生Master Secret。

如果服務端需要對客戶端進行驗證,在客戶端收到服務端的迴應消息之後,首先需要向服務端發送客戶端的證書,讓服務端來驗證客戶端的合法性。

三、客戶端進行證書驗證並回應服務端

接着,客戶端需要對接收到的服務端的證書進行檢查。

客戶端在驗證證書的時候,先看CA的根證書是否在自己的信任根證書列表中。再用CA的根證書提供的公鑰來驗證服務器證書中的數字簽名,如果公鑰可以解開簽名,證明該證書確實被CA所信任。再看證書是否過期,訪問的網站域名與證書綁定的域名是否一致。這些都通過,說明證書可以信任。

在此之前的所有TLS握手信息都是明文傳送的。在收到服務端的證書等信息之後,客戶端會使用一些加密算法(例如:RSA, Diffie-Hellman)產生一個48個字節的Key,這個Key叫PreMaster Secret,很多材料上也被稱作PreMaster Key ,最終通過Master secret生成session secret, session secret就是用來對應用數據進行加解密的。PreMaster secret屬於一個保密的Key,只要截獲PreMaster secret,就可以通過之前明文傳送的隨機數,最終計算出session secret,所以PreMaster secret使用RSA非對稱加密的方式,使用服務端傳過來的公鑰進行加密,然後傳給服務端

ChangeCipherSpec是一個獨立的協議,體現在數據包中就是一個字節的數據,用於告知服務端,客戶端已經切換到之前協商好的加密套件的狀態,準備使用之前協商好的加密套件加密數據並傳輸了。

在ChangecipherSpec傳輸完畢之後,客戶端會使用之前協商好的加密套件和session secret加密一段Finish的數據傳送給服務端,此數據是爲了在正式傳輸應用數據之前對剛剛握手建立起來的加解密通道進行驗證。

四、服務端迴應客戶端

服務端在接收到客戶端傳過來的PreMaster加密數據之後,使用私鑰對這段加密數據進行解密,並對數據進行驗證,也會使用跟客戶端同樣的方式生成session secret,一切準備好之後,會給客戶端發送一個ChangeCipherSpec,告知客戶端已經切換到協商過的加密套件狀態,準備使用加密套件和session secret加密數據了。之後,服務端也會使用session secret加密後一段Finish消息發送給客戶端,以驗證之前通過握手建立起來的加解密通道是否成功。

根據之前的握手信息,如果客戶端和服務端都能對Finish信息進行正常加解密且消息正確的被驗證,則說明握手通道已經建立成功,接下來,雙方可以使用上面產生的session secret對數據進行加密傳輸了。

五、應用數據傳輸

這裏瀏覽器與網站互相發送加密的握手消息並驗證,目的是爲了保證雙方都獲得了一致的密碼,並且可以正常的加密解密數據,爲後續真正數據的傳輸做一次測試。
在所有的握手階段都完成之後,就可以開始傳送應用數據了。應用數據在傳輸之前,首先要附加上MAC secret,然後再對這個數據包使用write encryption key進行加密。在服務端收到密文之後,使用Client write encryption key進行解密,客戶端收到服務端的數據之後使用Server write encryption key進行解密,然後使用各自的write MAC key對數據的完整性包括是否被串改進行驗證。

另外,HTTPS一般使用的加密與HASH算法如下:

非對稱加密算法:RSA,DSA/DSS 
對稱加密算法:AES,RC4,3DES 
HASH算法:MD5,SHA1,SHA256

其中非對稱加密算法用於在握手過程中加密生成的密碼,對稱加密算法用於對真正傳輸的數據進行加密,而HASH算法用於驗證數據的完整性。由於瀏覽器生成的密碼是整個數據加密的關鍵,因此在傳輸的時候使用了非對稱加密算法對其加密。非對稱加密算法會生成公鑰和私鑰,公鑰只能用於加密數據,因此可以隨意傳輸,而網站的私鑰用於對數據進行解密,所以網站都會非常小心的保管自己的私鑰,防止泄漏。

講到這裏,SSL/TLS的原理,實際上是HTTPS的原理講解完畢。

六、參考

http://blog.csdn.net/dyllove98/article/details/41826723

https://www.zhihu.com/question/39136361