Https:深入淺出HTTPS的互動過程
阿新 • • 發佈:2021-08-02
轉載: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,作為後續互動過程中的對稱金鑰。