HTTPS握手過程
HTTPS 即 HTTP over TLS,是一種在加密通道進行 HTTP 內容傳輸的協議。
TLS 的早期版本叫做 SSL。SSL 的 1.0, 2.0, 3.0 版本均已經被廢棄,出於安全問題考慮廣大瀏覽器也不再對老舊的 SSL 版本進行支援了,因此這裡我們就統一使用 TLS 名稱了。
所以,我們探討HTTPS的握手過程,其實就是 SSL/TLS的握手過程。
TLS旨在為Internet 提供通訊安全的加密協議。TLS握手是啟動和使用TLS加密的通訊會話的過程。在TLS握手期間,Internet中的通訊雙方會彼此交換資訊,驗證密碼套件,交換會話金鑰。
每當使用者通過HTTPS 導航到具體的網站併發送請求時,就會進行TLS握手。除此之外,每當其他任何通訊使用HTTPS(包括API呼叫和在 HTTPS上查詢DNS)時,也會發生TLS握手。
TLS通訊流程分為HTTP握手階段和TLS握手階段
TLS 的基本過程如下:
-
在進行通訊前,首先會進行HTTP的三次握手,握手完成後,再進行TLS的握手過程
-
客戶端傳送一個
ClientHello
訊息到伺服器端,訊息中同時包含了它的 Transport Layer Security (TLS) 版本,客戶端支援的密碼套件以及一串客戶端隨機數。 -
伺服器端向客戶端返回:
-
ServerHello
,訊息中包含了伺服器端的 TLS 版本,伺服器所選擇的支援的密碼套件,服務端生成的隨機數; -
server_certificates
,訊息包含了伺服器端配置的證書鏈,用於身份驗證與金鑰交換。 -
server_hello_done
,通知客戶端 server_hello 資訊傳送結束。
-
-
客戶端根據自己的信任 CA 列表,校驗證書的合法性。
-
合法性驗證包括如下:
(1) 證書鏈的可信性 trusted certificate path。
(2) 證書是否吊銷 revocation,有兩類方式離線 CRL 與線上 OCSP,不同的客戶端行為會不同。
(3) 有效期 expiry date,證書是否在有效時間範圍。
(4) 域名 domain,核查證書域名是否與當前的訪問域名匹配,匹配規則後續分析。
基於公鑰證書交換公鑰的分配過程 -
-
客戶端向伺服器端傳送:
-
client_key_exchange
- 客戶端根據自己的隨機數和伺服器端傳送來的隨機數生成對稱金鑰。
- 客戶端將之前所有通訊引數的 hash 值用公鑰加密後傳送給伺服器端。
-
change_cipher_spec
,客戶端通知伺服器使用私鑰解密訊息
-
-
伺服器端向客戶端返回:
- 伺服器端使用自己的私鑰解密訊息得到客戶端產生的隨機數,然後使用這串隨機數生成對稱金鑰
- 伺服器端計算之前所有接收資訊的 hash 值,然後解密客戶端傳送來的資訊,檢查這兩個值是否對應,驗證資料和金鑰正確性。
-
change_cipher_spec
,驗證通過後,伺服器端通知客戶端使用協商好的對稱金鑰加密訊息。
-
從現在開始,接下來整個 TLS 會話都使用對稱祕鑰進行加密,傳輸應用層(HTTP)內容
從上面的過程可以看到,TLS 的完整過程需要三個演算法(協議),金鑰互動演算法,對稱加密演算法,和訊息認證演算法(TLS 的傳輸會使用 MAC(message authentication code) 進行完整性檢查)
相關演算法圖解:
參考文章:
(1條訊息) TLS/SSL 工作原理及握手過程詳解_Tyler_Zx的部落格-CSDN部落格_tls原理圖解