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