HTTPS 原理

  1. Transport Layer Security (TLS) 是一種網路加密通信的方式。TLS 是 Secure Sockets Layer (SSL) 的接續協定,TLS 允許用戶端與服務端的互相驗證。
  2. TLS 以憑證為概念,憑證包含:公鑰、伺服器身份、憑證頒發單位的簽名。對應的私鑰永遠不會公開,任何使用私鑰加密的密鑰數據只能用公鑰來解密,反之亦然。加密通信流程:
    1. 用戶端發起 hello 交握:給伺服器的訊息有:
      1. 包含時間戳的 32 位元隨機數字 client_random
      2. 加密協定
      3. 用戶端支援的加密方式
    2. 服務端必須要有一套證書,可以自製或向組織申請。自己頒發的證書需要用戶端驗證通過,才可以繼續訪問,使用受信任單位申請的證書不會彈出提示頁面。本練習系統使用自己頒發的證書,產生方法請參考下一節。
    3. 一對公鑰和私鑰,可以想像成一把鑰匙 (私鑰) 和一個鎖頭 (公鑰),把鎖頭給用戶端將重要的資料鎖起來,客戶端將鎖好的資料傳給伺服器,只有伺服器有開鎖的鑰匙可以解開,所以即使傳送過程被截取也無法破解。
    4. 對於用戶端的 hello 交握,服務端回應以下訊息給用戶端:
      1. 另一個包含時間戳的 32 位元隨機數字 server_random
      2. 加密協定
      3. 加密方式
      4. 伺服器憑證:包含擁有者名稱、網站位址、證書公鑰、證書頒發機構數位簽章、過期時間等。 (下一節的 kvm5.crt)
    5. 用戶端驗證伺服器傳來的憑證是否有效?例如頒發機構、過期時間等,如果發現異常,則會彈出一個警告框,提示證書存在問題。 (本文不是使用第三方證書授權中心 (CA) 簽發的憑證,而是使用自己頒發的憑證,所以用戶端必須先取得簽發機構的公鑰(下一節的 kvm5.pem) 來驗證頒發機構簽名,才不會彈出警告框)
    6. 在此之前的所有 TLS 交握訊息都是明文傳送,現在收到伺服器的證書且驗證沒問題,則用戶端先產生 PreMaster_Secret
      1. 使用加密算法,例如:RSA, Diffie-Hellman,對 server_random 運算產生。
      2. 或稱 PreMaster_Key
      3. 是一個 48 個位元的 Key,前 2 個位元組是協議版本號,後 46 位元組是用在對稱加密金鑰的隨機數字。
    7. 用戶端用服務端送來的公鑰加密 PreMaster_Secret
    8. 用戶端將加密的 PreMaster_Secret 傳送給服務端,目的是讓服務端可以像用戶端用一樣隨機值產生 Master_Secret
    9. 服務端用私鑰 (下一節的 kvm5.key) 解密 PreMaster_Secret
      1. 此時用戶端與服服務端都有一份相同的 PreMaster_Secret 和隨機數 client_random, server_random
      2. 使用 client_randomserver_random 當種子,結合 PreMaster_Secret,用戶端和服務端將計算出同樣的 Master_Secret
      3. 作為資料加解密相關的 Key Material。
    10. 服務端用 PreMaster_Secret 加密資料傳給用戶端。
    11. 用戶端用產生 PreMaster_Secret 時的私鑰解密,也可用 PreMaster_Secret 加密回傳服務端。
    Image TLS_handshake2