必须配置ssl_dhparam以保障前向保密,需用openssl dhparam生成2048或3072位专属dh参数文件,严禁复用或使用4096位及-dsaparam,并在server块中正确加载、设权限、配强cipher套件,最后实测验证。

直接配置 ssl_dhparam 是增强 Nginx SSL 安全性的必要动作,不是可选项。它专为 DHE 类密钥交换提供高强度参数基础,防止 Logjam 等降级攻击,保障前向保密真正生效。
必须自己生成 DH 参数文件
Nginx 1.11.0 起已移除内置 DH 参数,未配置时会退回到系统或 OpenSSL 默认值——多数仍是已被攻破的 1024 位。复用网上下载的 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_dhparam /etc/nginx/ssl/dhparam.pem; - 顺序很重要:必须写在
ssl_certificate和ssl_certificate_key之后,否则 Nginx 启动可能报错 - 权限要严格:执行
chmod 600 /etc/nginx/ssl/dhparam.pem,确保仅属主可读,nginx worker 进程(如www-data)有读取权限 - 不建议全局写在
http块:按站点单独配置更利于差异化管理和故障隔离
配合现代 cipher suite 协同生效
DH 参数只对 DHE 套件起作用。即使你主用 ECDHE,仍需提供强 DH 参数——因为旧版 Java、IoT 设备、嵌入式浏览器等仍可能协商 DHE 套件。若无强参数,整条链路暴露于密钥重放风险。
- 确保
ssl_ciphers包含 DHE 套件(如DHE-RSA-AES256-GCM-SHA384),同时优先保留 ECDHE - 强制启用 TLSv1.2+:
ssl_protocols TLSv1.2 TLSv1.3; - 不要依赖默认套件:明确指定强组合,例如:
ssl_ciphers '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';
验证是否真正生效
配置完成后必须实测,确认协商使用的是你生成的参数,而非回退到弱默认值。
- 用 OpenSSL 测试:
openssl s_client -connect example.com:443 -cipher 'EDH' 2>/dev/null | grep "Server Temp Key"
正常输出应为:Server Temp Key: DH, 2048 bits或DH, 3072 bits - 用 SSL Labs(ssllabs.com)扫描:检查 “Key Exchange” 一栏是否显示对应位长,并标注 “Strong key exchange”
- 注意:若输出为
Server Temp Key: ECDH, secp256r1,说明当前协商走的是 ECDHE,不影响 DH 参数存在性;需强制触发 DHE 测试(如临时调整 cipher 限制)来验证 DH 部分











