# 密钥交换（Key Exchange，密钥协商）是什么？

> 密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤，保护连接的对称密钥都由这个共享秘密派生而来。

Source: https://ssl.sh/zh/glossary/key-exchange/
Last updated: 2026-11-10

密钥交换解决的是：双方怎样拿到同一个秘密，而窃听者无从得知。TLS 用过几种方式：RSA 密钥传输，即客户端用服务器 RSA 公钥加密一个随机的预主密钥（仅限 TLS 1.2 及更早版本）；临时 [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/) 密钥协商，即 DHE 或 [ECDHE](https://ssl.sh/zh/glossary/ecdhe/)；预共享密钥；以及最新的、加入后量子 KEM 的混合方案。TLS 1.3 中客户端在 supported_groups 里列出支持的群，并为最可能被选中的群直接发送 key_share；如果服务器想要的群客户端没发，就回一个 HelloRetryRequest，多花一个往返。

## 为什么重要
密钥交换方式决定了连接是否具备[前向保密](https://ssl.sh/zh/glossary/forward-secrecy/)，也决定了能否抵御未来的量子计算机。采用 RSA 密钥传输时，谁日后拿到服务器私钥，就能解密所有录下的历史会话。"先收集、后解密"的威胁，正是浏览器在后量子证书尚未普及时就先改用 X25519MLKEM768 等[混合密钥交换](https://ssl.sh/zh/glossary/hybrid-key-exchange/)的原因。

## 例子
TLS 中常见的密钥交换方式：

```text
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 时证书密钥只负责签名，交换强度取决于所用的群。

## 相关术语

- [ECDHE](https://ssl.sh/zh/glossary/ecdhe/): ECDHE 是椭圆曲线上的临时 Diffie-Hellman 密钥交换，TLS 双方每次握手都生成新的椭圆曲线密钥对，并据此协商出共享密钥。
- [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/): Diffie-Hellman 是 1976 年提出的密钥协商方法，让通信双方在公开信道上各自算出相同的共享秘密，而无需传输这个秘密本身。
- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [PSK](https://ssl.sh/zh/glossary/psk/): PSK（预共享密钥）是 TLS 双方在握手前就已共同持有的秘密，用于会话恢复，或在不使用证书的情况下完成身份认证。
- [混合密钥交换](https://ssl.sh/zh/glossary/hybrid-key-exchange/): 混合密钥交换把 X25519 等经典算法与 ML-KEM 等后量子 KEM 组合使用，只要其中一个未被攻破，得到的会话密钥就仍然安全。
- [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/): TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。
