密钥交换是什么
密钥交换决定 TLS 会话密钥怎么产生。RSA 密钥传输由客户端用服务器公钥加密预备主密钥,一旦私钥泄露历史流量就能被解密(不具备前向保密),TLS 1.3 已移除该方式;DHE 与 ECDHE 使用一次性的临时密钥协商,用完即扔,具备前向保密,如今是主流选择;PSK 用于会话恢复,安全性取决于预共享密钥的生命周期管理。
基本信息
| RSA 密钥传输 | 无前向保密,TLS 1.2 可用,1.3 已移除 |
|---|---|
| DHE | 临时 DH,具备前向保密,计算较重 |
| ECDHE | 椭圆曲线临时密钥,主流首选,常用 P-256 与 X25519 |
| PSK | 预共享密钥,用于会话恢复,需管理密钥生命周期 |
| 规范 | RFC 8446(1.3 的 key_share)、RFC 4492(ECC 套件) |
| 观测方式 | openssl s_client 输出中的 Server Temp Key |
典型使用场景
- 安全评审:确认线上协商的是 ECDHE 系列而非 RSA 密钥传输
- 解释「为什么握手要多一次往返」:DHE/ECDHE 与 TLS 1.3 的密钥共享机制相关
- 排查握手失败:客户端与服务端支持的曲线或套件无交集
- 国密与合规场景:确认密钥交换算法满足要求
- 客户端兼容性取舍:为老客户端保留必要套件的同时优先 ECDHE
识别与限制密钥交换方式
识别与限制密钥交换方式
# 查看实际使用的临时密钥类型
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | grep -i 'server temp key'
# 强制用 ECDHE 套件测试两端是否都支持
openssl s_client -cipher 'ECDHE-RSA-AES128-GCM-SHA256' -connect example.com:443 </dev/null >/dev/null && echo ok
# 枚举服务端支持的套件
nmap --script ssl-enum-ciphers -p 443 example.com | head -40
# 指定曲线测试
openssl s_client -connect example.com:443 -groups X25519 </dev/null 2>/dev/null | grep -i curve方式对比
| 方式 | 前向保密 | 现状 |
|---|---|---|
| RSA 密钥传输 | 不具备 | TLS 1.2 中可用但不推荐,1.3 已移除 |
| DHE | 具备 | 计算开销较大,实际使用较少 |
| ECDHE | 具备 | 主流首选,P-256 与 X25519 常用 |
| PSK | 取决于密钥来源 | TLS 1.3 会话恢复使用,需评估密钥生命周期 |
TLS 1.3 把密钥交换与认证拆开:客户端在 ClientHello 里就带上 key_share 预生成公钥,服务器可以直接算出共享密钥,这就是 1.3 能用一次往返完成握手的原因。
ECDHE 的临时密钥每次连接都更换,身份仍由证书私钥签名保证。因此证书私钥泄露后,攻击者可以冒充服务器,但无法解密此前录制的流量——这正是前向保密的价值所在。