HTTPS
HTTP協議安全上存在以下三個風險:完整性 可用性 保密性
竊聽風險,比如通信鏈路上可以獲取通信內容,用戶號容易沒。
篡改風險,比如強制植入垃圾廣告,視覺污染,用戶眼容易瞎。
冒充風險,比如冒充淘寶網站,用戶錢容易沒。
HTTPS 在 HTTP 與 TCP 層之間加入了 TLS 協議,來解決上述的風險。
TLS 協議是如何解決 HTTP 的風險的呢?
TLS能夠加密交互信息,如果信息泄露被篡改則會有警告提示,并且擁有身份證書證明發送端非偽造。
TLS 握手
上述每個框都是一個記錄,多個記錄可組合為一個tcp包,通常四個包就可以完成TCP握手
因為需要先完成TCP連接,然后通過TLS握手才建立安全通信鏈接,所以可以發現HTTPS是應用層協議。
密鑰交換算法
因為在傳輸過程中想要保證加密密鑰的安全性,所以采用了非對稱加密的方法來保護對稱加密的加密密鑰。
RSA密鑰協商握手過程
TLS 第一次握手
客戶端發起握手請求(ClientHello)
客戶端向服務器發送第一個消息,包含以下關鍵信息:
- 支持的 TLS 版本(如 TLS 1.2)。
- 支持的加密套件列表(需包含以 RSA 為密鑰交換方式的套件,如
TLS_RSA_WITH_AES_256_CBC_SHA
)。 - 客戶端生成的隨機數(Client Random):16 字節,用于后續密鑰計算。
- 其他可選信息(如壓縮方法、擴展字段等)。
TLS 第二次握手
服務器回應(ServerHello)
服務器根據客戶端的請求,選擇合適的配置并返回消息:
- 確認使用的 TLS 版本和加密套件(必須是客戶端支持的 RSA 類套件)。
- 服務器生成的隨機數(Server Random):16 字節,同樣用于密鑰計算。
- (可選)會話 ID:用于復用已有會話,減少握手次數。
客戶端驗證證書
服務器發送證書及相關信息(Certificate + ServerHelloDone)
- Certificate 消息:服務器向客戶端發送自己的數字證書(包含服務器 RSA 公鑰),證書鏈可能包含多級 CA 證書(從服務器證書到根 CA 證書)。
- (可選)CertificateRequest:若服務器需要驗證客戶端身份(如雙向認證),會請求客戶端證書。
- ServerHelloDone 消息:表示服務器已完成初始消息發送,等待客戶端回應。
TLS 第三次握手
客戶端發送加密的預主密鑰(ClientKeyExchange)
客戶端將加密后的 PMS 通過ClientKeyExchange 消息發送給服務器。由于 PMS 用服務器公鑰加密,中途被竊聽也無法解密。
客戶端和服務器計算會話密鑰(Master Secret + Session Keys)
- 服務器解密 PMS:服務器收到加密的 PMS 后,用自己的RSA 私鑰解密,得到原始的 Pre-Master Secret。
- 計算主密鑰(Master Secret):客戶端和服務器分別使用相同的算法,結合以下三個參數計算 Master Secret:
plaintext
Master Secret = PRF(Pre-Master Secret, "master secret", Client Random + Server Random)
其中,PRF
是偽隨機函數(Pseudorandom Function),用于將輸入轉換為固定長度的密鑰材料。 - 生成會話密鑰:再用 Master Secret、Client Random、Server Random 通過 PRF 生成用于實際通信的對稱密鑰(如 AES 密鑰、HMAC 密鑰等),包括:
- 客戶端加密密鑰、服務器加密密鑰(對稱加密,用于數據加密)。
- 客戶端 MAC 密鑰、服務器 MAC 密鑰(用于數據完整性校驗)。
客戶端驗證握手完整性(Finished 消息)
- 客戶端用生成的會話密鑰,對之前握手過程中的所有消息(ClientHello 到 ClientKeyExchange)計算摘要(通過 MAC 算法),并加密后通過Finished 消息發送給服務器。
- 目的:證明客戶端已正確生成會話密鑰,且握手過程未被篡改。
TLS 第四次握手
服務器驗證握手完整性并回應(Finished 消息)
- 服務器用自己生成的會話密鑰,對相同的握手消息計算摘要,與客戶端發送的 Finished 消息解密后的值對比,驗證客戶端是否正確生成密鑰。
- 驗證通過后,服務器同樣生成Finished 消息(加密握手消息摘要)并發送給客戶端,證明服務器也已正確生成密鑰。
握手完成,開始加密通信
客戶端和服務器均驗證通過后,握手結束。后續所有通信數據均使用協商出的對稱密鑰進行加密和校驗,確保機密性和完整性。