必须自己生成并配置ssl_dhparam,nginx 1.11.0+已移除内置dh参数,未配置将退回到不安全的1024位默认值,易遭logjam攻击;推荐用openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(常规)或3072(高敏),禁用-dsaparam和4096位,需在server块内证书指令后正确引用并设chmod 600权限,最后通过openssl命令、ssl labs及s_client验证生效。

必须自己生成并配置 ssl_dhparam,不能跳过或复用他人文件。Nginx 1.11.0 起已移除内置 DH 参数,未配置时会退回到系统默认的 1024 位参数——该长度已被实证可在数小时内被离线破解,Logjam 攻击可借此解密历史通信流。
生成高强度 DH 参数文件
使用 OpenSSL 命令生成 PEM 格式参数,核心是位长选择与参数类型正确:
-
常规生产环境推荐 2048 位:执行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048。生成快(通常几十秒),兼容性广,满足 PCI DSS、等保2.0 等主流合规要求 -
高敏感场景(如金融、政务)建议 3072 位:执行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072。抗长期算力进步,生成耗时约 1–3 分钟,属合理开销 -
禁用 -dsaparam 参数:例如
openssl dhparam -dsaparam生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致 Android 旧版本、OpenSSL 1.0.x 客户端握手失败 - 避免 4096 位:生成可能耗时数小时,Nginx 加载易超时,且安全增益极小,实际部署中极少采用
在 Nginx 配置中精准加载
生成后若路径、权限或位置出错,ssl_dhparam 就不会生效:
-
放在启用 HTTPS 的 server 块内,且必须位于
ssl_certificate和ssl_certificate_key之后,顺序错误会导致 Nginx 启动失败 -
文件路径需绝对准确,例如:
ssl_dhparam /etc/nginx/ssl/dhparam.pem; -
权限设为 600:执行
chmod 600 /etc/nginx/ssl/dhparam.pem,确保只有 nginx worker 进程用户(如www-data或nginx)可读 - 不建议写在 http 块顶层,除非所有站点共用同一组参数;按站点单独配置更利于安全策略差异化管理
验证是否真正生效
配置完成后必须验证,不能仅凭语法检查就认为已加固:
-
本地快速验证:运行
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "prime",确认输出含3072 bit或2048 bit -
线上协议层验证:用
openssl s_client -connect example.com:443 -cipher "DHE" 2>/dev/null | grep "Server Temp Key",应显示DH, 2048 bits或DH, 3072 bits - 第三方权威扫描:提交域名至 SSL Labs(ssllabs.com),查看 “Key Exchange” 是否标注 “DH 3072” 并明确显示 “Forward Secrecy: Yes”
这一步不是锦上添花,而是防止密钥流被批量回溯破解的必要防线。即使主用 ECDHE,仍需提供强 DH 参数——因为旧版 Java、IoT 设备、嵌入式客户端可能协商 DHE 套件,缺了它,整条前向保密链就断了。











