TLS 工作原理和詳細握手過程

來源:https://segmentfault.com/a/1190000021559557

前言

在上篇文章HTTPS詳解一中,我已經為大家介紹了 HTTPS 的詳細原理和通信流程,但總感覺少了點什麼,應該是少了對安全層的針對性介紹,那麼這篇文章就算是對HTTPS 詳解一的補充吧。還記得這張圖吧。

HTTPS詳解(二):SSL / TLS 工作原理和詳細握手過程

HTTPS 和 HTTP的區別

顯然,HTTPS 相比 HTTP最大的不同就是多了一層 SSL (Secure Sockets Layer 安全套接層)或 TLS (Transport Layer Security 安全傳輸層協議)。有了這個安全層,就確保了互聯網上通信雙方的通信安全,那麼這個安全層是怎麼工作的,SSL / TLS 握手過程又是怎樣的呢?本文將對這些問題一一解答。

1、SSL / TLS 以及 SSL / TLS 握手的概念

SSL 和 TLS 協議可以為通信雙方提供識別和認證通道,從而保證通信的機密性和數據完整性。TLS 協議是從Netscape SSL 3.0協議演變而來的,不過這兩種協議並不兼容,SSL 已經逐漸被 TLS 取代,所以下文就以 TLS 指代安全層。 TLS 握手是啟動 HTTPS 通信的過程,類似於 TCP 建立連接時的三次握手。 在 TLS 握手的過程中,通信雙方交換消息以相互驗證,相互確認,並確立它們所要使用的加密算法以及會話密鑰 (用於對稱加密的密鑰)。可以說,TLS 握手是 HTTPS 通信的基礎部分。

2、TLS 握手過程中發生了什麼

我們已經知道 TLS 握手的目的是建立安全連接,那麼通信雙方在這個過程中究竟幹了什麼呢?下面就是答案:

  • 商定雙方通信所使用的的 TLS 版本 (例如 TLS1.0, 1.2, 1.3等等);
  • 確定雙方所要使用的密碼組合;
  • 客戶端通過服務器的公鑰和數字證書 (上篇文章已有介紹)上的數字簽名驗證服務端的身份;
  • 生成會話密鑰,該密鑰將用於握手結束後的對稱加密。

3、TLS 握手詳細過程

下面來看 TLS 握手的詳細過程 (:此圖與HTTPS詳解一中的 HTTPS 原理圖的流程大致相同,不同的是此圖把重點放在了TLS握手的相關概念上):

HTTPS詳解(二):SSL / TLS 工作原理和詳細握手過程

SSL / TLS 握手詳細過程

  1. "client hello"消息:客戶端通過發送"client hello"消息向服務器發起握手請求,該消息包含了客戶端所支持的 TLS 版本和密碼組合以供服務器進行選擇,還有一個"client random"隨機字符串。
  2. "server hello"消息:服務器發送"server hello"消息對客戶端進行回應,該消息包含了數字證書,服務器選擇的密碼組合和"server random"隨機字符串。
  3. 驗證:客戶端對服務器發來的證書進行驗證,確保對方的合法身份,驗證過程可以細化為以下幾個步驟:檢查數字簽名驗證證書鏈 (這個概念下面會進行說明)檢查證書的有效期檢查證書的撤回狀態 (撤回代表證書已失效)
  4. "premaster secret"字符串:客戶端向服務器發送另一個隨機字符串"premaster secret (預主密鑰)",這個字符串是經過服務器的公鑰加密過的,只有對應的私鑰才能解密。
  5. 使用私鑰:
    服務器使用私鑰解密"premaster secret"。
  6. 生成共享密鑰:客戶端和服務器均使用 client random,server random 和 premaster secret,並通過相同的算法生成相同的共享密鑰 KEY
  7. 客戶端就緒:客戶端發送經過共享密鑰 KEY加密過的"finished"信號。
  8. 服務器就緒:服務器發送經過共享密鑰 KEY加密過的"finished"信號。
  9. 達成安全通信:握手完成,雙方使用對稱加密進行安全通信。

4、TLS 握手過程中的一些重要概念

  1. 數字證書 (digital certificate):在非對稱加密通信過程中,服務器需要將公鑰發送給客戶端,在這一過程中,公鑰很可能會被第三方攔截並替換,然後這個第三方就可以冒充服務器與客戶端進行通信,這就是傳說中的“中間人攻擊”(man in the middle attack)。解決此問題的方法是通過受信任的第三方交換公鑰,具體做法就是服務器不直接向客戶端發送公鑰,而是要求受信任的第三方,也就是證書認證機構 (Certificate Authority, 簡稱 CA)將公鑰合併到數字證書中,然後服務器會把公鑰連同證書一起發送給客戶端,私鑰則由服務器自己保存以確保安全。數字證書一般包含以下內容:證書所有者的公鑰證書所有者的專有名稱證書頒發機構的專有名稱證書的有效起始日期證書的過期日期證書數據格式的版本號序列號,這是證書頒發機構為該證書分配的唯一標識符... ...
  2. 數字簽名 (digital signature):這個概念很好理解,其實跟人的手寫簽名類似,是為了確保數據發送者的合法身份,也可以確保數據內容未遭到篡改,保證數據完整性。與手寫簽名不同的是,數字簽名會隨著文本數據的變化而變化。具體到數字證書的應用場景,數字簽名的生成和驗證流程如下:服務器對證書內容進行信息摘要計算 (常用算法有 SHA-256等),得到摘要信息,再用私鑰把摘要信息加密,就得到了數字簽名服務器把數字證書連同數字簽名一起發送給客戶端客戶端用公鑰解密數字簽名,得到摘要信息客戶端用相同的信息摘要算法重新計算證書摘要信息,然後對這兩個摘要信息進行比對,如果相同,則說明證書未被篡改,否則證書驗證失敗
  3. 證書鏈 (certificate chain):證書鏈,也稱為證書路徑,是用於認證實體合法身份的證書列表,具體到 HTTPS 通信中,就是為了驗證服務器的合法身份。之所以使用證書鏈,是為了保證根證書 (root CA certificate)的安全,中間層可以看做根證書的代理,起到了緩衝的作用,如下圖所示,這裡還以 B 站證書為例:
HTTPS詳解(二):SSL / TLS 工作原理和詳細握手過程

證書鏈

證書鏈從根證書開始,並且證書鏈中的每一級證書所標識的實體都要為其下一級證書籤名,而根證書自身則由證書頒發機構簽名。客戶端在驗證證書鏈時,必須對鏈中所有證書的數字簽名進行驗證,直到達到根證書為止。

4.密碼規範和密碼組合 (CipherSpecs 和 CipherSuites):通信雙方在安全連接中所使用的算法必須符合密碼安全協議的規定,CipherSpecs 和 CipherSuites 正好定義了合法的密碼算法組合。CipherSpecs 用於認證加密算法和信息摘要算法的組合,通信雙方必須同意這個密碼規範才能進行通信。而 CipherSuites 則定義了 SSL / TLS 安全連接中所使用的加密算法的組合,該組合包含三種不同的算法:

  1. 握手期間所使用的的密鑰交換和認證算法 (最常用的是 RSA 算法)
  2. 加密算法 (用於握手完成後的對稱加密,常用的有 AES、3DES等)
  3. 信息摘要算法 (常用的有 SHA-256、SHA-1 和 MD5 等)

4、總結

本文對 SSL / TLS 握手過程進行了詳細的解析,也對握手過程中的幾個重要概念進行了補充說明。想繼續深入瞭解的小夥伴可以去參考一下 CloudFlare 和 IBM 的官網,這兩個網站也是本文內容的主要來源。多逛逛英文網站,不僅可以漲姿勢,獲取權威信息,還能順帶提升一波英語水平,一舉兩得,豈不美哉,希望小夥伴們也能儘快養成這樣的好習慣。HTTPS 詳解部分到此結束,咱們下篇文章再見。


分享到:


相關文章: