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,前向保密基本是默认具备的。
六、选择依据与配置建议
实际配置时,可按以下优先级判断:
| 场景 | 推荐密钥交换 | 理由 |
|---|---|---|
| 公网 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,同样具备前向保密。
总结来看,密钥交换算法的选择应遵循“优先 ECDHE、TLS 1.3 默认 (EC)DHE、PSK 按场景使用、RSA 密钥交换逐步淘汰”的原则。理解每种算法的密钥来源和生命周期,就能准确判断一条 TLS 连接是否具备前向保密,并据此做出合理的配置决策。