Https詳解

micDavid發表於2021-07-06

概述

HTTPS,從字面上看,即在HTTP協議下加上一層SSL(安全套接字層 secure socket layer),對於上層應用來看,原來的傳送接收資料的流程不變,這便很好的相容了HTTP協議。


11383162-3d104487ce8114cf.jpg

一、協議的加密流程

我們知道,非對稱加密是相較於對稱加密更為安全的一種加密方式,但是非對稱加密所需要耗費的計算資源也會隨之提高許多。所以https協議的基本原理就是,通過SSL/TLS握手安全的協商出一份對稱加密的金鑰,隨後傳輸的資料都採用該金鑰進行加解密

1.1、SSL/TLS握手過程

11383162-787f6abff01430f8.gif
1. Client Hello

握手第一步是客戶端向服務端傳送 Client Hello 訊息,這個訊息裡包含了一個客戶端生成的隨機數 Random1、客戶端支援的加密套件(Support Ciphers)和 SSL Version 等資訊。

2. Server Hello

第二步是服務端向客戶端傳送 Server Hello 訊息,這個訊息會從 Client Hello 傳過來的 Support Ciphers 裡確定一份加密套件,這個套件決定了後續加密和生成摘要時具體使用哪些演算法,另外還會生成一份隨機數 Random2。注意,至此客戶端和服務端都擁有了兩個隨機數(Random1+ Random2),這兩個隨機數會在後續生成對稱祕鑰時用到。
客戶端驗證
這一步是服務端將自己的證書下發給客戶端,讓客戶端驗證自己的身份,客戶端驗證通過後取出證書中的公鑰。

3. Certificate Verify

客戶端收到服務端傳來的證書後,先從 CA 驗證該證書的合法性,驗證通過後取出證書中的服務端公鑰,再生成一個隨機數 Random3,再用服務端公鑰非對稱加密 Random3 生成 PreMaster Key

上面客戶端根據伺服器傳來的公鑰生成了 PreMaster Key,Client Key Exchange 就是將這個 key 傳給服務端,服務端再用自己的私鑰解出這個 PreMaster Key 得到客戶端生成的 Random3。至此,客戶端和服務端都擁有 Random1 + Random2 + Random3,兩邊再根據同樣的演算法就可以生成一份祕鑰,握手結束後的應用層資料都是使用這個祕鑰進行對稱加密。為什麼要使用三個隨機數呢?這是因為 SSL/TLS 握手過程的資料都是明文傳輸的,並且多個隨機數種子來生成祕鑰不容易被暴力破解出來。

4. 金鑰協商驗證

伺服器收到客戶端的第三個隨機數pre-master key之後,計算生成本次會話所用的"會話金鑰"。然後,向客戶端最後傳送下面資訊。

(1)編碼改變通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送。

(2)伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面傳送的所有內容的hash值,用來供客戶端校驗。

至此,整個握手階段全部結束。接下來,客戶端與伺服器進入加密通訊,就完全是使用普通的HTTP協議,只不過用"會話金鑰"加密內容。

相關文章