密钥交换 (Key Exchange,密钥协商)
定义
密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤,保护连接的对称密钥都由这个共享秘密派生而来。
密钥交换解决的是:双方怎样拿到同一个秘密,而窃听者无从得知。TLS 用过几种方式:RSA 密钥传输,即客户端用服务器 RSA 公钥加密一个随机的预主密钥(仅限 TLS 1.2 及更早版本);临时 Diffie-Hellman 密钥协商,即 DHE 或 ECDHE;预共享密钥;以及最新的、加入后量子 KEM 的混合方案。TLS 1.3 中客户端在 supported_groups 里列出支持的群,并为最可能被选中的群直接发送 key_share;如果服务器想要的群客户端没发,就回一个 HelloRetryRequest,多花一个往返。
为什么重要
密钥交换方式决定了连接是否具备前向保密,也决定了能否抵御未来的量子计算机。采用 RSA 密钥传输时,谁日后拿到服务器私钥,就能解密所有录下的历史会话。"先收集、后解密"的威胁,正是浏览器在后量子证书尚未普及时就先改用 X25519MLKEM768 等混合密钥交换的原因。
例子
TLS 中常见的密钥交换方式:
Method Protocols Forward secrecy
RSA key transport TLS 1.2 and older No
DHE / ECDHE TLS 1.2, TLS 1.3 Yes
PSK only TLS 1.2, TLS 1.3 No
PSK with (EC)DHE TLS 1.2, TLS 1.3 Yes
X25519MLKEM768 TLS 1.3 Yes, plus post-quantum
常见误区
- 密钥交换和身份认证是同一步。 密钥交换负责建立秘密,证书密钥的签名负责认证服务器。RSA 密钥传输把两者混在一起,这也是 TLS 1.3 删掉它的原因之一。
- 看套件名就能知道密钥交换方式。 TLS 1.2 是这样,但 TLS 1.3 的群是单独协商的,套件名里看不出来。
- RSA 证书密钥越长,密钥交换越安全。 使用 ECDHE 时证书密钥只负责签名,交换强度取决于所用的群。