必须手动配置ssl_dhparam,否则nginx将退回到已被攻破的1024位默认dh参数,导致前向保密失效、logjam攻击可乘;需用openssl dhparam生成2048或3072位专属文件,禁用4096位和-dsaparam,置于server块证书指令后并设600权限,配合dhe套件与tlsv1.2+实测验证。

必须手动配置 ssl_dhparam,否则 Nginx 会退回到不安全的默认 DH 参数(通常是已被攻破的 1024 位),前向保密无法真正生效,Logjam 类攻击可直接利用。
生成专属 DH 参数文件
不能复用网上下载的 dhparam.pem,也不能依赖系统默认值——所有服务器共用同一组 p/g,等于共享密钥交换“地基”,前向保密彻底失效。
- 常规推荐:执行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(生成快、兼容广、满足 PCI DSS 等主流合规) - 高敏感场景(如金融、政务):用
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072(抗算力升级更强,生成耗时约 1–3 分钟) - 绝对避免 4096 位:生成极慢(数小时),Nginx 加载易超时,安全提升却微乎其微
- 严禁加
-dsaparam参数:它生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致 Android 旧版本、OpenSSL 1.0.x 等客户端握手失败
在 server 块中正确加载
ssl_dhparam 必须写在启用 HTTPS 的 server 块内,且顺序和权限直接影响是否生效。
- 位置要准确:必须放在
ssl_certificate和ssl_certificate_key之后,否则 Nginx 启动可能报错 - 路径要写全:例如
ssl_dhparam /etc/nginx/ssl/dhparam.pem; - 权限要严格:执行
chmod 600 /etc/nginx/ssl/dhparam.pem,确保仅属主可读;同时确认 nginx worker 进程用户(如www-data或nginx)有读取权限 - 不建议全局写在
http块:按站点单独配置更利于差异化管理和故障隔离
配合 cipher 套件协同生效
DH 参数只对 DHE 类套件起作用。即使你主用 ECDHE,仍需提供强 DH 参数——因为旧版 Java、IoT 设备、嵌入式浏览器等仍可能协商 DHE。
- 确保
ssl_ciphers明确包含 DHE 套件,例如DHE-RSA-AES256-GCM-SHA384 - 优先保留 ECDHE,但不要省略 DHE:推荐组合如
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:DHE-RSA-AES256-GCM-SHA384 - 强制启用 TLSv1.2+:
ssl_protocols TLSv1.2 TLSv1.3;,不依赖默认协议列表
验证是否真正生效
配置完不能认为万事大吉,必须实测确认。
- 用 OpenSSL 检查:运行
openssl s_client -connect yourdomain.com:443 -cipher 'DHE' | grep "Server public key",应看到 DH 参数长度(如 2048 或 3072) - 用 SSL Labs 扫描(ssllabs.com/ssltest)查看 “Key Exchange” 一栏是否显示强 DH 参数及前向保密状态
- 检查 Nginx 启动日志,确认无
ssl_dhparam相关错误或警告











