4. 密钥交换算法族

密钥交换算法决定了 TLS 握手时客户端与服务器如何协商出共享的会话密钥。它既影响握手性能,也直接决定连接是否具备前向保密能力。理解 RSA、DHE、ECDHE、PSK 以及 TLS 1.3 的 (EC)DHE 与 PSK 模式,是判断一套密码套件是否安全、是否适合当前业务的关键。

一、密钥交换要解决的核心问题

握手阶段双方需要得到一组只有彼此知道的对称密钥,用于后续记录层的加密与完整性保护。密钥交换算法要解决三件事:身份认证(确认对方是合法服务器)、密钥协商(生成共享秘密)、抗攻击性(防止中间人窃听或篡改)。不同算法族的差异,主要就体现在这三点的实现方式上。

二、RSA 密钥交换:没有前向保密

在 TLS 1.2 及更早版本中,RSA 密钥交换的工作方式是:客户端生成一个 48 字节的预主密钥(Pre-Master Secret),用服务器证书中的 RSA 公钥加密后发送给服务器,服务器用私钥解密得到预主密钥,双方再据此推导主密钥和会话密钥。

问题在于:会话密钥的安全性完全依赖服务器长期私钥。如果攻击者长期录制流量,并在未来某天拿到了服务器私钥,就可以解密历史会话中的预主密钥,从而还原所有会话密钥。这就是不具备前向保密(Forward Secrecy)。因此现代安全配置中,RSA 密钥交换已被视为不推荐选项。

三、DHE 与 ECDHE:实现前向保密

DHE(Diffie-Hellman Ephemeral)和 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)使用临时密钥对完成密钥协商。每次握手都生成新的临时私钥,握手结束后即丢弃。即使服务器长期私钥泄露,攻击者也无法还原过去会话的临时密钥,因此具备前向保密。

两者的区别在于数学基础:DHE 基于有限域离散对数,密钥和计算量较大;ECDHE 基于椭圆曲线离散对数,在相同安全强度下密钥更短、计算更快。例如 256 位 ECDHE(P-256 曲线)约等于 3072 位 DHE 的安全强度,但性能明显更优。因此 ECDHE 成为当前主流选择。

ECDHE 握手时,服务器用证书私钥对临时公钥做签名,客户端验证签名后完成密钥协商。这里证书私钥只用于认证,不再用于解密预主密钥,这正是前向保密的来源。

四、PSK:预共享密钥模式

PSK(Pre-Shared Key)不依赖证书和公钥运算,双方预先配置同一把密钥,握手时通过密钥派生直接得到会话密钥。它的优势是计算开销极低、握手消息少,适合物联网、嵌入式设备或内网服务间通信。缺点是密钥分发和管理困难,且一旦预共享密钥泄露,所有相关会话都受影响。PSK 本身通常也不提供前向保密,除非与 (EC)DHE 结合使用。

五、TLS 1.3 的密钥交换模式

TLS 1.3 对密钥交换做了大幅精简,只保留两类模式:

  • (EC)DHE 模式:基于临时密钥协商,默认具备前向保密,是 TLS 1.3 的标准模式。
  • PSK 模式:包括会话恢复(session resumption)和外部预共享密钥,可单独使用,也可与 (EC)DHE 组合形成 PSK+(EC)DHE,从而同时获得低开销和前向保密。

TLS 1.3 已彻底移除 RSA 密钥交换和静态 DH,所有基于证书的握手都必须使用 (EC)DHE。这意味着只要使用 TLS 1.3,前向保密基本是默认具备的。

密钥交换算法族:前向保密与模式对比 RSA 密钥交换 客户端用服务器公钥 加密预主密钥 服务器私钥解密 无私钥即无法解密 ✗ 无前向保密 DHE 有限域离散对数 每次握手生成临时密钥 证书私钥仅做签名 密钥较大、计算较重 ✓ 前向保密 ECDHE 椭圆曲线离散对数 临时密钥对,握手后丢弃 256 位 ≈ 3072 位 DHE 性能优、密钥短 ✓ 前向保密 PSK 预共享密钥 无证书、无公钥运算 开销极低 密钥管理困难 △ 默认无 FS 前向保密原理:长期私钥泄露 ≠ 历史会话可解密 RSA:会话密钥 ← 服务器私钥解密预主密钥 → 私钥泄露即历史流量全部暴露 (EC)DHE:会话密钥 ← 临时私钥协商,握手后销毁 → 长期私钥泄露也无法还原历史会话 TLS 1.3 密钥交换模式 (EC)DHE 模式 默认前向保密 PSK 模式 会话恢复 / 外部 PSK PSK + (EC)DHE 低开销 + 前向保密

六、选择依据与配置建议

实际配置时,可按以下优先级判断:

场景 推荐密钥交换 理由
公网 HTTPS 服务 ECDHE(P-256 / X25519) 前向保密 + 性能优,兼容性好
仅支持 TLS 1.3 (EC)DHE 或 PSK+(EC)DHE TLS 1.3 默认前向保密
物联网 / 内网低功耗设备 PSK 或 PSK+(EC)DHE 无证书、开销低;组合模式可补前向保密
旧客户端兼容 ECDHE 优先,DHE 兜底 避免 RSA 密钥交换,保留前向保密
合规要求前向保密 禁用 RSA 密钥交换 RSA 无法满足前向保密要求

在 Nginx 中,可通过 ssl_ciphers 明确指定 ECDHE 套件,例如:

ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;

该配置只保留 ECDHE 密钥交换,禁用 RSA 密钥交换,从而保证前向保密。若需兼容极旧客户端,可加入 DHE 套件,但应使用 2048 位以上 DH 参数。

判断依据:查看密码套件名称中是否包含 ECDHE 或 DHE。包含则具备前向保密;只包含 RSA(如 AES128-SHA 这类 RSA 密钥交换套件)则不具备。TLS 1.3 套件名中虽不显式写 ECDHE,但其密钥交换默认使用 (EC)DHE,同样具备前向保密。
常见误区:证书使用 RSA 算法并不等于密钥交换使用 RSA。ECDHE-RSA 套件中,RSA 仅用于签名认证,密钥交换仍是 ECDHE,具备前向保密。真正决定前向保密的是密钥交换算法,而不是证书算法。

总结来看,密钥交换算法的选择应遵循“优先 ECDHE、TLS 1.3 默认 (EC)DHE、PSK 按场景使用、RSA 密钥交换逐步淘汰”的原则。理解每种算法的密钥来源和生命周期,就能准确判断一条 TLS 连接是否具备前向保密,并据此做出合理的配置决策。