TLS 1.3 與它的前身大不相同

移除的東西#

  • 淘汰弱演算法:MD5、SHA-1、RC4,以及 CBC 模式的 AES。
  • 只支援鑑別式密碼:TLS 1.2 經常用「密碼 + MAC」(例如 HMAC-SHA-1)的 MAC-then-encrypt 建構保護記錄,TLS 1.3 則只支援更有效率也更安全的鑑別式密碼。
  • 捨棄橢圓曲線點編碼協商:為每條曲線定義單一的點格式。
  • 捨棄選用的資料壓縮

TLS 1.3 主要的開發目標之一,就是移除 1.2 中削弱協定的功能,降低協定整體的複雜度,從而縮小它的攻擊面。

例如捨棄資料壓縮,正是因為該功能促成了針對 TLS 1.2 的 CRIME 攻擊——該攻擊利用了「一則訊息壓縮後的長度會洩漏訊息內容的資訊」這個事實。

新增的東西#

TLS 1.3 也帶來讓連線更安全或更高效的新功能。以下談三個。

降級保護#

降級保護(downgrade protection)是針對降級攻擊的防禦——攻擊者強迫客戶端與伺服器使用比 1.3 更弱的 TLS 版本。

執行降級攻擊的方式:攻擊者攔截並修改 ClientHello 訊息,告訴伺服器該客戶端不支援 TLS 1.3,藉此強迫伺服器使用較弱的 TLS 版本。

接著攻擊者就能利用舊版 TLS 中的漏洞。

防禦機制:TLS 1.3 伺服器在 ServerHello 訊息所送的 32 位元組隨機值中,用三種樣式來標示所請求的連線型態。這個樣式應該與客戶端所請求的 TLS 連線型態相符——若客戶端收到錯誤的樣式,它就知道出事了。

客戶端請求的版本ServerHello 隨機值的前 8 個位元組
TLS 1.244 4F 57 4E 47 52 44 01
TLS 1.144 4F 57 4E 47 52 44 00
TLS 1.3應為隨機

例如客戶端送出請求 TLS 1.3 連線的 ClientHello,但網路上的攻擊者把它改成請求 TLS 1.1 連線。當客戶端收到帶有錯誤樣式的 ServerHello 時,它就會知道自己的 ClientHello 訊息被修改過了

攻擊者無法任意修改伺服器的 32 位元組隨機值,因為這個值是經過密碼學簽章的。

單次往返握手#

典型的 TLS 1.2 握手中,客戶端送出資料、等待回應、再送出更多資料、再等待伺服器回應,然後才開始送加密訊息——延遲是兩次往返時間(RTT)

相對地,TLS 1.3 的握手只需要一次往返時間。

省下的時間可能是數百毫秒。這聽起來不多,但當你考慮到熱門服務的伺服器每秒要處理數千條連線時,這其實相當可觀

工作階段恢復#

TLS 1.3 比 1.2 快,但還能更快——藉由完全消除加密工作階段之前的往返。

訣竅是使用工作階段恢復(session resumption):利用客戶端與伺服器在先前工作階段中交換的預共享金鑰,來啟動一個新的工作階段。

工作階段恢復帶來兩大好處:

  • 客戶端可以立刻開始加密。
  • 後續工作階段不需要使用憑證。

流程:

客戶端                                        伺服器
產生金鑰對 (c, C = cQ)

ClientHello                    ──→            產生金鑰對 (s, S = sQ)
- 預共享金鑰(PSK)ID                          導出 keys = KDF(PSK, DH(s, C))
- 公鑰 C
- 0-RTT 資料

                               ←──            ServerHello
導出 keys = KDF(PSK, DH(c, S))                - 預共享金鑰(PSK)ID
用 keys 驗證 MAC                               - 公鑰 S

                               ←──            MAC(對 ClientHello、ServerHello)

說明:

  1. 客戶端送出的 ClientHello 包含已與伺服器共享之金鑰的識別碼(記為 PSK)以及一把新的 DH 公鑰。
  2. 客戶端也可以在這第一則訊息中就夾帶加密資料——這類資料稱為 0-RTT 資料
  3. 伺服器回應 ClientHello 時,提供對所交換資料的 MAC。
  4. 客戶端驗證該 MAC,就知道自己正在與先前同一台伺服器對話,使得憑證驗證變得有些多餘
  5. 客戶端與伺服器如同一般握手那樣執行 Diffie–Hellman 金鑰協商,後續訊息使用同時依賴 PSK 與新算出之 DH 共享秘密的金鑰加密。

圖 13-2:TLS 1.3 的工作階段恢復握手:0-RTT 資料隨 ClientHello 一起送出