DH 参数与 Logjam 教训
Diffie-Hellman 密钥交换的安全性完全取决于所用素数群。2015 年公开的 Logjam 研究表明,大量 HTTPS 与 VPN 服务共用同一批 1024 位素数,攻击者可以预先计算离散对数表,再对单条连接做降级攻击,把强度拉到可破解的档位。修复方向很明确:只启用 2048 位及以上的群,并优先使用 RFC 7919 定义的命名组,不再让服务端自己生成素数。
基本信息
| 事件 | Logjam(2015),针对 DHE_EXPORT 与共享弱素数 |
|---|---|
| 弱参数 | 1024 位及以下的自定义群 |
| 修复一 | 仅启用 2048 位及以上的群,套件中排除 EXPORT |
| 修复二 | 优先使用 RFC 7919 命名组:ffdhe2048 / ffdhe3072 / ffdhe4096 |
| 影响范围 | TLS、SSH、IPsec 与各类 VPN 都可能受同一类问题影响 |
| 验证方式 | 套件扫描加实际协商测试,确认最小群强度 |
典型使用场景
- 加固 Nginx、Apache 与 OpenSSL 的 DHE 套件和参数配置
- 排查 VPN(IPsec/IKE)与 SSH 实际协商的密钥交换群强度
- 内网设备升级评估:老旧固件只支持 1024 位时判断能否替换或隔离
- 合规审计取证:提交实际协商群与最小强度要求的对照结论
测试服务端是否接受 DHE 及协商组
测试服务端是否接受 DHE 及协商组
# 只看临时密钥与协商组(Windows PowerShell 用 Select-String,Linux 用 grep)
openssl s_client -connect example.com:443 -cipher 'DHE-RSA-AES256-GCM-SHA384' </dev/null | Select-String 'Server Temp Key'
# 列出服务端是否还保留弱套件(EXPORT 级必须消失)
openssl s_client -connect example.com:443 -cipher 'DHE:!EXPORT' </dev/null
# 指定命名组手测:协商成功说明服务端至少支持该强度
openssl s_client -connect example.com:443 -groups ffdhe2048 </dev/null | Select-String 'Server Temp Key'群强度对照
| 群或长度 | 安全评估 | 处置建议 |
|---|---|---|
| ffdhe2048 | 当前可接受下限 | 面向公网的服务至少使用该强度 |
| ffdhe3072 | 中长期安全 | 新部署优先选择 |
| 1024 位自定义群 | 可被预计算攻击命中 | 立即停用并换成命名组 |
| 512 位或 export 级 | 已被实际破解 | 必须关闭,套件中排除 EXPORT |
把 1024 位参数当成兼容必需是常见误判:主流浏览器与 OpenSSL 早已支持 2048 位及以上,保留弱群只会把降级空间留给攻击者。
与 ECDHE 的取舍:ECDHE(如 X25519)握手更短、性能更好,是当前 TLS 的默认选择;但 DH 仍广泛存在于 SSH、IPsec 与部分合规要求中,两套都要会看会改。
命名组的优势在于参数公开固定:服务端不再生成随机素数,既避免弱群,也避免启动时生成大素数造成的抖动。只有确有合规要求时才自建参数,且必须校验为安全素数。