必须手动生成专属 dh 参数并配置 ssl_dhparam,nginx 1.11.0+ 已移除内置参数,未配置将退至不安全的 1024 位默认值,导致 logjam 攻击风险与前向保密失效;推荐 openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072(高敏)或 2048(常规),禁用 -dsaparam 和 4096 位,指令须置于 server 块内证书指令后、权限设 600,并通过 openssl、ssl labs 及 s_client 多维度验证生效。

直接在 Nginx 的 server 块中用 ssl_dhparam 指令加载你自生成的 PEM 文件,这是增强 DHE 密钥交换强度、保障前向保密的核心操作。关键不在“怎么写配置”,而在于参数是否专属、位长是否合理、位置和权限是否正确。
必须手动生成专属 DH 参数文件
不能跳过这步,也不能复用网上下载的 dhparam.pem 或依赖系统默认值——Nginx 1.11.0+ 已移除内置参数,未配置时多数会退回到不安全的 1024 位 DH 组,Logjam 攻击可直接利用。
- 推荐执行:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072(兼顾安全性与握手性能,抗算力升级能力强) - 资源受限或需快速上线时可用:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(仍满足 PCI DSS、等保2.0 等合规要求) - 绝对避免:
4096位(生成耗时数小时,Nginx 加载易超时,安全增益极小) - 严禁加
-dsaparam参数(生成的是 DSA 兼容参数,会导致 Android 旧版本、OpenSSL 1.0.x 等客户端握手失败)
在 server 块中正确加载 ssl_dhparam
该指令必须放在启用 SSL 的 server 块内,且顺序和路径直接影响是否生效。
- 路径要写全且可读,例如:
ssl_dhparam /etc/nginx/ssl/dhparam.pem; - 必须置于
ssl_certificate和ssl_certificate_key之后,否则 Nginx 启动可能报错 - 文件权限设为
600:chmod 600 /etc/nginx/ssl/dhparam.pem,防止敏感参数泄露 - 确认 Nginx worker 进程用户(如
www-data或nginx)对该文件有读取权限
配合 TLS 协议与密钥交换机制协同生效
ssl_dhparam 单独存在没有意义,它只为 DHE 类套件提供安全底座,必须和现代 TLS 配置联动才真正起效。
- 协议至少启用:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/TLSv1.1) - 加密套件优先选 ECDHE(如
ECDHE-ECDSA-AES256-GCM-SHA384),同时保留 DHE 套件兼容旧客户端;没有强 DH 参数,DHE 就会降级失效 - 不要依赖证书自带的 DH 参数(部分旧证书含 1024 位 DH),必须显式指定你自生成的文件
验证是否真正生效
上线后务必验证,不能只看配置有没有写上。
- 检查文件内容:
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











