HTTPS連線建立過程(單向&雙向)

嘿123發表於2020-07-03

HTTPS連線建立過程(單向&雙向)

什麼是https

SSL(Secure Sockets Layer 安全套接字協議),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網路通訊提供安全及資料完整性的一種安全協議。TLS與SSL在傳輸層(如TCP)與應用層(如HTTP)之間對網路連線進行加密。
HTTPS (全稱:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全為目標的 HTTP 通道,在HTTP的基礎上通過傳輸加密和身份認證保證了傳輸過程的安全性 。HTTPS 在HTTP 的基礎下加入SSL 層

  • https的基礎是TLS,tls的基本原理是非對稱加密,即加密的金鑰和解密的金鑰是不用的,稱為公鑰和私鑰,使用公鑰加密的內容只能使用私鑰解密,反之亦然,使用私鑰並不能解密私鑰加密的內容
  • https連線建立過程分為兩部分 一是身份驗證部分(驗證通訊雙方各自的身份),二是金鑰協商部分(協商出一個雙方都認可的對稱金鑰)
  • https的重點如下
    1. 客戶端及伺服器的有效性及真實性,確保沒有第三方監聽,通過CA機構及非對稱加密保證
    2. tls握手及金鑰協商過程使用非對稱加密,加強身份驗證及防監聽
    3. 由於非對稱加密的效能極差,所以僅在握手階段使用非對稱加密
    4. 後續訊息通過協商的金鑰進行加密,防篡改和防監聽

TCP連線建立流程

TCP連結建立流程

HTTPS單向認證

什麼是HTTPS單向認證

  • https單向認證至客戶端連線到某個域名或IP時,客戶端需要驗證伺服器的身份,
    伺服器的身份一般通過證書的方式進行驗證,伺服器的證書一般都會在權威的CA機構進行簽名,客戶端收到伺服器證書後,
    會獲取伺服器證書對應的ca機構的證書,並用CA證書進行解密

身份認證過程

  • 一般使用非對稱加密演算法做身份認證
  • RSA
  • DSA
  • ECDSA

https證書籤名及認證過程

金鑰協商過程

  • 有多種演算法
  • RSA 通過非對稱加密保證安全性
  • DH類演算法 通過 "求解離散對數問題" 保證安全性 只能防監聽,不能防篡改,所以一般會結合非對稱加密演算法(RSA,DSA,ECDSA)等做加密
  • ECDH類演算法 通過 "橢圓曲線離散對數問題" 保證安全性 同上
  • DHE DH演算法增強 E->ephemeral 指“臨時金鑰”(洋文是“ephemeral key”)即每個會話都選擇新的金鑰
  • ECDHE ECDH演算法增強 同上
  • PSK 預共享金鑰(一般用於內部部署,預置金鑰在系統內部)
  • SRP Secure Remote Password,與psk類似,金鑰換成了密碼,還會有一些類似於加鹽,隨機數之類的機制

https金鑰協商過程

連線流程

  • ECDHE-RSA的連線及認證過程

https連線及協商過程

https連線抓包過程


身份認證

  1. Client Hello 傳送客戶端支援的加密協議 及TLS版本 客戶端隨機數
    https_client_hello內容

    • sessionId和sessionTicket均可用於https會話恢復,區別在與sessionId對應的協商資訊儲存在伺服器中,sessionTicket對應的協商資訊儲存在客戶端中
    • 客戶端extension中攜帶session ticket資訊表示客戶端支援session ticket
    • 關於擴充套件欄位 pre_shared_key 和psk_key_exchange_modes,可以參考http://ddrv.cn/a/17072
    • 本例中客戶端不傳遞pre_shared_key指明客戶端不使用PSK(預共享金鑰模式,一般用在個人網路裡面)
  2. Sever Hello 傳送伺服器選擇的加密協議及選擇的TLS版本,伺服器隨機數

    • 本例中使用的是ECDHE-RSA演算法
      https_server_hello內容
  3. Certificate 伺服器傳送自己的證書
    https_server_certificate內容


金鑰協商

  1. Server Key Exchange 伺服器傳送協商對稱金鑰過程中的必要引數

    • DH類演算法因為沒有使用私鑰進行計算,所以在末尾會使用私鑰對報文字身進行簽名,證明自己擁有私鑰
      https_server_key_exchange內容
  2. Server Hello Done

    • 指示 Server Hello完成
  3. Client Key Exchange 客戶端傳送協商金鑰過程中的必要引數(使用服務端證書中的公鑰加密)

    • 客戶端收到伺服器傳送的必要引數,並使用自己的必要引數,計算出一個對稱金鑰
    • 客戶端必要引數傳送給服務端後,服務端也能通過這些引數以及第5部中的引數計算出一樣的對稱金鑰
      https_client_key_exchange
  4. Client change Cipher Spec

    • 更改資料傳輸金鑰通知,表示後續的請求都會使用協商好的對稱金鑰進行加密
  5. Encrypted Handshake Message

    • 使用對稱金鑰加密過後的握手訊息,用來驗證對稱金鑰是否工作
  6. New Session Ticket

    • 由於之前Client Hello及Server Hello都指明瞭可以使用Session Ticket,所以伺服器下發了一個新的Session Ticket,下次客戶端需要恢復回話時,可以省去協商金鑰的過程
  7. Server change Cipher Spec

    • 更改資料傳輸金鑰通知,表示後續的請求都會使用協商好的對稱金鑰進行加密
  8. Encrypted Handshake Message

    • 使用對稱金鑰加密過後的握手訊息,用來驗證對稱金鑰是否工作

HTTPS雙向認證

https雙向認證指除了客戶端需要驗證伺服器之外,伺服器也需要驗證客戶端

連線流程

https雙向認證流程
https雙向認證抓包

  • 步驟詳解
    • 雙向認證過程中的大部分步驟是相同的,只是多了伺服器請求客戶端證書以及客戶端傳送證書及簽名的過程
    • 這裡僅解釋不同的部分
  1. Server Certificate Request
    • 伺服器請求客戶端證書用於驗證客戶端身份

https_server_certificate_request內容

  1. Client Certificate
    • 客戶端傳送自己的證書或證書鏈

https_client_certificate內容

  1. Client Certificate Verify
    • 與server key exchange一樣,為了證明自己的身份,客戶端需要使用私鑰對之前的握手資訊加密
    • 伺服器使用客戶端證書公鑰解密,如果一致的話才會通過驗證

https_client_certificate_verify內容

nginx中的配置

ssl_certificate      /etc/nginx/cert2/server.crt; #伺服器證書位置
ssl_certificate_key  /etc/nginx/cert2/server.private;#伺服器證書私鑰檔案位置
ssl_client_certificate /etc/nginx/cert2/ca.crt;#用於客戶端證書校驗的證書檔案位置,意為客戶端證書必須由此證書對應的ca機構簽發
ssl_verify_client on;#是否開啟客戶端校驗
ssl_verify_depth 2;#客戶端校驗深度,如果為1的話,代表客戶端證書必須由頂級ca簽發

附錄

演算法組合 金鑰交換 身份認證 是否會遭遇中間人攻擊 是否具備前向保密 SSL 2.0 SSL 3.0 TLS 1.0 TLS 1.1 TLS 1.2 TLS 1.3(草案)
RSA RSA RSA
DH-RSA DH RSA
DH-DSA DH DSA
DHE-RSA DHE RSA
DHE-DSA DHE DSA
ECDH-RSA ECDH RSA
ECDH-ECDSA ECDH ECDSA
ECDHE-RSA DHE RSA
ECDHE-ECDSA DHE ECDSA
PSK PSK PSK
PSK-RSA PSK RSA
DHE-PSK DHE PSK
ECDHE-PSK DHE PSK
SRP SRP SRP
SRP-RSA SRP RSA
SRP-DSA SRP DSA
DH-ANON DH
ECDH-ANON ECDH

參考資料

相關文章