轉載:https://blog.csdn.net/en_joker/article/details/105533383
說到HTTPS,就需要知道HTTP。我們知道這兩個都是應用層方面的協議,HTTP是無狀態的,因為他的報文是明文,很容易被人截取后篡改。也就是說,他是不安全的。
然而在我們主機與目標服務器進行信息交互的過程中,不可避免地會涉及到支付、登錄后等進行的一系列需要保密和其他的相關操作信息。於是出現了HTTPS協議。
HTTPS 簡介
由於HTTP 協議通信的不安全性,所以人們為了防止信息在傳輸過程中遭到泄漏或者篡改,就想出來對傳輸通道進行加密的方式https。https 是一種加密的超文本傳輸協議,它與HTTP 在協議差異在於對數據傳輸的過程中,https 對數據做了完全加密。由於http 協議或者https協議都是處於TCP 傳輸層之上,同時網絡協議又是一個分層的結構,所以在tcp 協議層之上增加了一層SSL(Secure Socket Layer,安全層)或者TLS(Transport Layer Security) 安全層傳輸協議組合使用用於構造加密通道;
HTTPS 的實現原理
初始化過程
- 首先,服務端需要先申請證書,服務端生成一個公私鑰(s.pub/s.pri)同時保存自己的私鑰。
- 緊接着,需要把公鑰、國家、城市、域名、簽名算法等重要信息發送給CA機構。
CA機構會把服務端傳過來的公鑰進行加密,數字等進行數據,把客戶端的私鑰來加密服務端的公鑰,生成數字證書。並且內置倒瀏覽器里面。
數字證書我們可以在win10系統去查看,直接瀏覽器地址欄,如果是https協議的一般會有證書的展示:
請求交互時的過程
客戶端發起請求(Client Hello 包)
- 三次握手,建立TCP 連接
- 支持的協議版本(TLS/SSL)
- 客戶端生成的隨機數client.random,后續用於生成“對話密鑰”
- 客戶端支持的加密算法
- sessionid,用於保持同一個會話(如果客戶端與服務器費盡周折建立了一個HTTPS 鏈接,剛建完就斷了,也太可惜)
服務端收到請求,然后響應(Server Hello)
- 確認加密通道協議版本
- 服務端生成的隨機數server.random,后續用於生成“對話密鑰”
- 確認使用的加密算法(用於后續的握手消息進行簽名防止篡改)
- 響應服務器證書(CA 機構頒發給服務端的證書)
客戶端收到證書進行驗證
- 驗證證書是否是上級CA 簽發的, 在驗證證書的時候,瀏覽器會調用系統的證書管理器接口對證書路徑中的所有證書一級一級的進行驗證,只有路徑中所有的證書都是受信的,整個驗證的結果才是受信。
- 服務端返回的證書中會包含證書的有效期,可以通過失效日期來驗證證書是否過期。
- 驗證證書是否被吊銷了
- 前面我們知道CA 機構在簽發證書的時候,都會使用自己的私鑰對證書進行簽名。證書里的簽名算法字段 sha256RSA 表示CA 機構使用sha256對證書進行摘要,然后使用RSA 算法對摘要進行私鑰簽名,而我們也知道RSA 算法中,使用私鑰簽名之后,只有公鑰才能進行驗簽。
- 瀏覽器使用內置在操作系統上的CA機構的公鑰對服務器的證書進行驗簽。確定這個證書是不是由正規的機構頒發。驗簽之后得知CA 機構使用sha256 進行證書摘要,然后客戶端再使用sha256 對證書內容進行一次摘要,如果得到的值和服務端返回的證書驗簽之后的摘要相同,表示證書沒有被修改過。
- 驗證通過后,就會顯示綠色的安全字樣。
- 客戶端生成隨機數,驗證通過之后,客戶端會生成一個隨機數pre-master secret , 客戶端根據之前的: Client.random +sever.random + pre-master 生成對稱密鑰然后使用證書中的公鑰進行加密,同時利用前面協商好的加密算法,將握手消息取HASH 值,然后用“隨機數加密“握手消息+握手消息HASH 值(簽名)”然后傳遞給服務器端;(在這里之所以要取握手消息的HASH值,主要是把握手消息做一個簽名,用於驗證握手消息在傳輸過程中沒有被篡改過。)
服務端接收隨機數
- 服務端收到客戶端的加密數據以后,用自己的私鑰對密文進行解密。然后得到client.random/server.random/pre-master secret. ,再用隨機數密碼 解密 握手消息與HASH 值,並與傳過來的HASH 值做對比確認是否一致。
- 然后用隨機密碼加密一段握手消息(握手消息+握手消息的HASH 值 )給客戶端。
客戶端接收消息
- 客戶端用隨機數解密並計算握手消息的HASH,如果與服務端發來的HASH 一致,此時握手過程結束,
- 之后所有的通信數據將由之前交互過程中生成的pre master secret /client.random/server.random 通過算法得出sessionKey,作為后續交互過程中的對稱密鑰。