Nginx需配置强DH参数以防范Logjam攻击,必须手动生成2048位或更长的dhparam.pem文件并用ssl_dhparam指令加载,同时禁用弱协议与不安全密钥交换方式。

在Nginx中启用强DH(Diffie-Hellman)密钥交换参数,是防范Logjam等中间人攻击、提升TLS握手安全性的关键一步。默认情况下,OpenSSL提供的DH参数强度不足(如1024位),必须手动替换为至少2048位的自定义参数。
为什么需要自定义DH参数
Nginx 1.11.0+ 默认不内置DH参数,若未显式配置 ssl_dhparam,会回退到系统或OpenSSL默认的弱DH组(常见为1024位),极易被离线计算破解。Logjam攻击正是利用这一点,强制降级到512位出口级密钥。
实际部署中,即使启用了ECDHE,仍需提供强DH参数——因为部分客户端(如旧版Java、某些嵌入式设备)可能协商传统DHE套件。
生成安全的DH参数文件
使用OpenSSL生成2048位(推荐)或更长的DH参数。注意:不要用openssl dhparam -dsaparam(它生成DSA兼容参数,不适用于标准DH)。
-
生成2048位DH参数(推荐,兼顾安全与性能):
openssl dhparam -out /etc/nginx/dhparam.pem 2048 -
生成3072位(更高安全等级,适合金融/政府场景):
openssl dhparam -out /etc/nginx/dhparam.pem 3072 - 生成过程耗时较长(尤其3072位),建议后台运行或提前准备;可加
-dsaparam加速但不推荐用于生产
在Nginx中正确加载并启用
将生成的dhparam.pem文件路径写入server块或http块,并确保权限严格(仅nginx worker可读):
- 在对应server配置中添加:
ssl_dhparam /etc/nginx/dhparam.pem; - 确认该指令位于
ssl_certificate和ssl_certificate_key之后,且未被重复或覆盖 - 执行
nginx -t校验语法,再nginx -s reload热重载 - 验证是否生效:
openssl s_client -connect your-domain.com:443 -cipher "DHE" 2>/dev/null | grep "Server Temp Key"
输出应显示Server Temp Key: DH, 2048 bits(或3072)
进阶加固建议
仅配置DH参数还不够,需配合完整TLS策略才能真正发挥效果:
- 禁用不安全的密钥交换方式:
在ssl_ciphers中移除所有含!DHE以外的弱套件,明确优先ECDHE,例如:ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256; - 禁用SSLv2/v3和TLS 1.0/1.1:
ssl_protocols TLSv1.2 TLSv1.3; - 开启OCSP Stapling,减少证书状态查询延迟与隐私泄露风险

















