必须手动配置 ssl_dhparam,否则 Nginx 会使用弱 DH 参数(如1024位),导致前向保密失效,易受 Logjam 攻击;自 1.11.0 起已移除内置参数,依赖系统默认值(多为不安全的1024位);即使主用 ECDHE,部分旧客户端仍协商 DHE,若无强 DH 参数则整链路暴露;复用他人 dhparam.pem 更危险,等同共享密钥交换地基,彻底破坏前向保密;应使用 openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072 生成(资源受限可选2048位),禁用4096位及 -dsaparam;配置时需确保路径正确、权限为600、置于 server 块内且在证书配置之后;最后通过 openssl 命令、SSL Labs 扫描及 s_client 测试验证生效。

必须手动配置 ssl_dhparam,否则 Nginx 会回退到弱 DH 参数(如 1024 位),前向保密形同虚设,Logjam 攻击可直接利用。
为什么不能跳过 ssl_dhparam 配置
从 Nginx 1.11.0 开始,已移除内置 DH 参数。未显式设置时,实际加载的是 OpenSSL 或系统默认值——多数仍为 1024 位,已被实证可在数小时内被离线分解。即使你主用 ECDHE,旧版 Java 客户端、IoT 设备或某些嵌入式浏览器仍可能协商 DHE 套件,此时若无强 DH 参数,整条链路就暴露在密钥重放与中间人风险中。复用他人 dhparam.pem 更危险:所有服务器共用同一组素数 p 和生成元 g,等于共享密钥交换的“地基”,前向保密性彻底失效。
生成安全可用的 DH 参数文件
使用 OpenSSL 命令行生成,关键在位长选择与参数类型:
- 推荐执行:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072——3072 位是当前安全与性能的最优平衡点,抗算力升级能力更强,生成耗时通常在 1–3 分钟 - 资源受限环境可用 2048 位:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048,仍满足 PCI DSS、等保2.0 等主流合规要求 - 绝对避免 4096 位:生成时间极长(数小时),Nginx 加载时易触发超时,且安全增益微乎其微
- 严禁加
-dsaparam参数(如openssl dhparam -dsaparam ...):它生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致部分客户端(尤其是 Android 旧版本、OpenSSL 1.0.x)握手失败
Nginx 中正确加载和验证
生成后需确保路径、权限、位置三者准确无误:
- 将
dhparam.pem放入 Nginx 可读目录(如/etc/nginx/ssl/),并设严格权限:chmod 600 /etc/nginx/ssl/dhparam.pem - 在启用 SSL 的
server块内配置,且必须位于ssl_certificate和ssl_certificate_key之后:ssl_certificate /etc/nginx/ssl/example.com.crt;<br>ssl_certificate_key /etc/nginx/ssl/example.com.key;<br>ssl_dhparam /etc/nginx/ssl/dhparam.pem;
- 切勿放在
http块顶层(除非全部站点共用同一份参数),否则可能因路径解析异常导致启动失败 - 配置后务必运行
nginx -t测试语法,再nginx -s reload生效
上线后快速验证是否生效
仅配置完成不等于真正起效,需交叉验证:
- 检查文件内容:
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "Prime:",确认输出中 Prime(P) 长度为 3072 或 2048 - 用 SSL Labs 工具扫描域名,在 “Key Exchange” 栏应明确显示 “DH 3072” 且标注 “Forward Secrecy: Yes”
- 终端直连测试:
openssl s_client -connect example.com:443 -cipher 'EDH' 2>/dev/null | grep "Server Temp Key",返回结果应为Server Temp Key: DH, 3072 bits


















