必须自己生成并配置ssl_dhparam,因nginx 1.11.0+已移除内置dh参数,未配置将退至不安全的1024位默认值,导致logjam攻击风险与前向保密失效;推荐用openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048或3072生成,禁用-dsaparam及4096位,配置于server块内证书指令后,权限设600,并通过openssl命令、ssl labs扫描及s_client直连验证生效。

必须自己生成并配置 ssl_dhparam,不能跳过、复用他人文件或依赖系统默认值。Nginx 1.11.0 起已移除内置 DH 参数,未配置时会退回到 OpenSSL 提供的 1024 位默认值——该参数已被实证可在数小时内被离线分解,Logjam 攻击可强制降级并批量解密流量,前向保密完全失效。
生成高强度 DH 参数文件
使用 OpenSSL 命令生成 PEM 格式参数,避开常见陷阱:
- 常规生产环境推荐执行:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(生成快、兼容广、满足 PCI DSS 和等保 2.0 最低要求) - 高敏感场景(如金融、政务)推荐执行:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072(抗长期算力升级,生成耗时约 1–3 分钟) - 绝对不要加
-dsaparam:它生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致 Android 旧版本、OpenSSL 1.0.x 客户端握手失败 - 避免使用 4096 位:生成极慢(可能数小时),Nginx 加载易超时,且安全增益微乎其微
在 Nginx 中正确加载 ssl_dhparam
该指令需精准放置,否则形同虚设:
- 必须写在启用 HTTPS 的
server块内,且位于ssl_certificate和ssl_certificate_key之后 - 路径必须准确,例如:
ssl_dhparam /etc/nginx/ssl/dhparam.pem; - 文件权限设为
600:chmod 600 /etc/nginx/ssl/dhparam.pem - 确认 nginx worker 进程用户(如
www-data或nginx)对该文件有读取权限
验证是否真正生效
配置后必须多角度验证,不能仅靠 reload 就认为完成:
- 本地检查参数位数:
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "prime",确认输出含3072 bit或2048 bit - 语法与重载:
nginx -t通过后执行nginx -s reload - 线上扫描验证:用 SSL Labs(ssllabs.com)扫描域名,查看 “Key Exchange” 是否显示 “DH 3072” 并标注 “Forward Secrecy: Yes”
- 终端直连核验:
openssl s_client -connect example.com:443 -tls1_2,观察输出中Server Temp Key行是否为DH, 3072 bits











