一篇文章讓你徹底弄懂SSL/TLS協議
SSL/TLS是一種密碼通信框架,他是世界上使用最廣泛的密碼通信方法。SSL/TLS綜合運用了密碼學中的對稱密碼,消息認證碼,公鑰密碼,數字簽名,偽隨機數生成器等,可以說是密碼學中的集大成者。
SSL(Secure Socket Layer)安全套接層,是1994年由Netscape公司設計的一套協議,並與1995年發布了3.0版本。
TLS(Transport Layer Security)傳輸層安全是IETF在SSL3.0基礎上設計的協議,實際上相當於SSL的后續版本。
SSL/TLS的應用
SSL/TLS是一個安全通信框架,上面可以承載HTTP協議或者SMTP/POP3協議等。
TLS協議的架構
TLS主要分為兩層,底層的是TLS記錄協議,主要負責使用對稱密碼對消息進行加密。
上層的是TLS握手協議,主要分為握手協議,密碼規格變更協議和應用數據協議4個部分。
-
握手協議負責在客戶端和服務器端商定密碼算法和共享密鑰,包括證書認證,是4個協議中最最復雜的部分。
-
密碼規格變更協議負責向通信對象傳達變更密碼方式的信號
-
警告協議負責在發生錯誤的時候將錯誤傳達給對方
-
應用數據協議負責將TLS承載的應用數據傳達給通信對象的協議。
握手協議
握手協議是TLS協議中非常重要的協議,通過客戶端和服務器端的交互,和共享一些必要信息,從而生成共享密鑰和交互證書。
不說話,先上圖:
接下來我們一步步的介紹每一步的含義:
-
client hello
客戶端向服務器端發送一個client hello的消息,包含下面內容:
- 可用版本號
- 當前時間
- 客戶端隨機數
- 會話ID
- 可用的密碼套件清單
- 可用的壓縮方式清單
我們之前提到了TLS其實是一套加密框架,其中的有些組件其實是可以替換的,這里可用版本號,可用的密碼套件清單,可用的壓縮方式清單就是向服務器詢問對方支持哪些服務。
客戶端隨機數是一個由客戶端生成的隨機數,用來生成對稱密鑰。
-
server hello
服務器端收到client hello消息后,會向客戶端返回一個server hello消息,包含如下內容:
- 使用的版本號
- 當前時間
- 服務器隨機數
- 會話ID
- 使用的密碼套件
- 使用的壓縮方式
使用的版本號,使用的密碼套件,使用的壓縮方式是對步驟1的回答。
服務器隨機數是一個由服務器端生成的隨機數,用來生成對稱密鑰。
-
可選步驟:certificate
服務器端發送自己的證書清單,因為證書可能是層級結構的,所以處理服務器自己的證書之外,還需要發送為服務器簽名的證書。
客戶端將會對服務器端的證書進行驗證。如果是以匿名的方式通信則不需要證書。 -
可選步驟:ServerKeyExchange
如果第三步的證書信息不足,則可以發送ServerKeyExchange用來構建加密通道。
ServerKeyExchange的內容可能包含兩種形式:
- 如果選擇的是RSA協議,那么傳遞的就是RSA構建公鑰密碼的參數(E,N)。我們回想一下RSA中構建公鑰的公式:\(密文=明文^E\ mod\ N\), 只要知道了E和N,那么就知道了RSA的公鑰,這里傳遞的就是E,N兩個數字。具體內容可以參考RSA算法詳解
- 如果選擇的是Diff-Hellman密鑰交換協議,那么傳遞的就是密鑰交換的參數,具體內容可以參考更加安全的密鑰生成方法Diffie-Hellman
-
可選步驟:CertificateRequest
如果是在一個受限訪問的環境,比如fabric中,服務器端也需要向客戶端索要證書。
如果並不需要客戶端認證,則不需要此步驟。 -
server hello done
服務器端發送server hello done的消息告訴客戶端自己的消息結束了。 -
可選步驟:Certificate
對步驟5的回應,客戶端發送客戶端證書給服務器
-
ClientKeyExchange
還是分兩種情況:
- 如果是公鑰或者RSA模式情況下,客戶端將根據客戶端生成的隨機數和服務器端生成的隨機數,生成預備主密碼,通過該公鑰進行加密,返送給服務器端。
- 如果使用的是Diff-Hellman密鑰交換協議,則客戶端會發送自己這一方要生成Diff-Hellman密鑰而需要公開的值。具體內容可以參考更加安全的密鑰生成方法Diffie-Hellman,這樣服務器端可以根據這個公開值計算出預備主密碼。
-
可選步驟:CertificateVerify
客戶端向服務器端證明自己是客戶端證書的持有者。
-
ChangeCipherSpec(准備切換密碼)
ChangeCipherSpec是密碼規格變更協議的消息,表示后面的消息將會以前面協商過的密鑰進行加密。
-
finished(握手協議結束)
客戶端告訴服務器端握手協議結束了。
-
ChangeCipherSpec(准備切換密碼)
服務器端告訴客戶端自己要切換密碼了。
-
finished(握手協議結束)
服務器端告訴客戶端,握手協議結束了。
-
切換到應用數據協議
這之后服務器和客戶端就是以加密的方式進行溝通了。
主密碼和預備主密碼
上面的步驟8生成了預備主密碼,主密碼是根據密碼套件中定義的單向散列函數實現的偽隨機數生成器+預備主密碼+客戶端隨機數+服務器端隨機數生成的。
主密碼主要用來生成稱密碼的密鑰,消息認證碼的密鑰和對稱密碼的CBC模式所使用的初始化向量。詳見分組密碼和模式
TLS記錄協議
TLS記錄協議主要負責消息的壓縮,加密及數據的認證:
先上圖。
消息首先將會被分段,然后壓縮,再計算其消息驗證碼,然后使用對稱密碼進行加密,加密使用的是CBC模式,CBC模式的初始向量是通過主密碼來生成的。
得到密文之后會附加類型,版本和長度等其他信息,最終組成最后的報文數據。
更多內容請訪問 flydean的博客