必须自己生成dh参数文件,不能跳过或复用他人文件;nginx 1.11.0起已移除内置dh参数,未配置ssl_dhparam将退至1024位默认值,该长度已被实证可在数小时内被离线破解,logjam攻击可借此解密历史通信流。

必须自己生成 DH 参数文件,不能跳过或复用他人文件。Nginx 1.11.0 起已移除内置 DH 参数,未配置 ssl_dhparam 时会退回到系统默认的 1024 位参数——该长度已被证实可在数小时内被离线破解,Logjam 攻击可借此解密历史通信流。
选择合适位长生成 dhparam 文件
位长决定安全强度与握手性能的平衡,推荐按场景选择:
-
常规生产环境(推荐):执行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048。生成快(通常几十秒),兼容性广,满足 PCI DSS、等保2.0 等主流合规要求 -
高敏感场景(如金融、政务):执行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072。抗长期算力进步,生成耗时约 1–3 分钟,属合理开销 - 避免使用 4096 位:生成可能耗时数小时,Nginx 加载易超时,且安全增益极小,实际部署中极少采用
-
禁用 -dsaparam 参数:例如
openssl dhparam -dsaparam生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致 Android 旧版本、OpenSSL 1.0.x 客户端握手失败
确保生成过程可靠且文件格式正确
生成操作需在维护窗口或后台执行,避免阻塞服务:
- 生成耗时属正常现象(2048 位数秒至一分钟,3072 位可达数分钟),建议提前运行或使用
nohup openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 & - 生成后检查文件是否为 PEM 格式:运行
head -n 1 /etc/nginx/ssl/dhparam.pem,应输出-----BEGIN DH PARAMETERS----- - 验证参数位长:运行
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "prime",确认输出含2048 bit或3072 bit
设置严格文件权限并准备加载路径
文件权限和路径准确性直接影响 Nginx 是否能成功读取参数:
- 执行
chmod 600 /etc/nginx/ssl/dhparam.pem,确保只有 nginx worker 进程用户(如www-data或nginx)可读,禁止 world-readable - 将文件放在 Nginx 可读目录(如
/etc/nginx/ssl/),路径须为绝对路径,避免相对路径引发加载失败 - 确认 nginx 主进程(root)和 worker 进程用户对该路径有读取权限;必要时调整目录权限(如
chmod 755 /etc/nginx/ssl)
后续配置与验证要点
生成只是第一步,真正生效依赖正确加载与验证:
-
ssl_dhparam指令必须写在启用 HTTPS 的server块内,且位于ssl_certificate和ssl_certificate_key之后,顺序错误会导致 Nginx 启动失败 - 线上验证命令:
openssl s_client -connect example.com:443 -cipher 'DHE' 2>/dev/null | grep "Server Temp Key",应显示DH, 2048 bits或DH, 3072 bits - 第三方扫描推荐使用 SSL Labs 测试,查看 “Key Exchange” 一栏是否明确标注
DH 2048或DH 3072,并确认 “Forward Secrecy: Yes”











