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


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

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM