必须手动配置 ssl_dhparam,否则 nginx 会退回到不安全的 1024 位 dh 参数,导致前向保密失效和 logjam 攻击风险;推荐用 openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(常规)或 3072(高敏)生成专属参数,禁用 -dsaparam 和 4096 位,置于 server 块内证书指令后,设 chmod 600 权限,并通过 openssl、ssl labs 及 s_client 三重验证生效。

必须手动配置 ssl_dhparam,否则 Nginx 会退回到系统或 OpenSSL 提供的 1024 位 DH 参数——这类参数已被实证可在数小时内被离线分解,前向保密完全失效。尤其当旧客户端(如 Java 7、某些 IoT 设备)协商 DHE 套件时,若没配强 DH 参数,整条加密链路就暴露在 Logjam 类攻击之下。
生成高强度 DH 参数文件
使用 OpenSSL 生成专属参数,避免复用他人文件(共享 p/g 等于共享密钥交换底座):
-
推荐方案(兼顾安全与性能):运行
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048,生成耗时通常在几秒到一分钟内 -
高敏场景(如金融、政务):改用
3072位:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072,抗算力升级更久 -
禁用选项:不要加
-dsaparam(不兼容标准 DH 协商),也不要选4096位(生成极慢,Nginx 加载可能超时,安全增益却很有限)
在 Nginx 中正确加载参数
该指令必须出现在启用 SSL 的 server 块内,且位置和权限有明确要求:
- 放在
ssl_certificate和ssl_certificate_key之后,避免路径错误导致启动失败 - 设置文件权限为
600(仅属主可读写):chmod 600 /etc/nginx/ssl/dhparam.pem - 确保 Nginx worker 进程用户(如
www-data或nginx)对该文件有读取权限 - 若多个 HTTPS server 共用同一组参数,可统一放在
http块顶层,但需确认所有站点都适用
验证是否真正生效
配置不是终点,必须验证实际握手是否使用了你生成的参数:
- 检查文件内容:
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "prime:",确认 Prime(P) 长度为 2048 或 3072 - 直连测试(强制走 DHE):
openssl s_client -connect example.com:443 -cipher 'EDH' 2>/dev/null | grep "Server Temp Key",输出应为Server Temp Key: DH, 2048 bits或类似 - 用 SSL Labs 测试工具 扫描域名,在 “Key Exchange” 栏确认显示 “DH 2048” 或 “DH 3072”,且标注 “Forward Secrecy: Yes”
配合现代密码套件协同加固
ssl_dhparam 只对传统 DHE 套件起作用;ECDHE 使用椭圆曲线,不依赖该文件。但为覆盖所有客户端,建议:
- 主推 ECDHE 套件(如
ECDHE-ECDSA-AES256-GCM-SHA384),同时保留 DHE 套件作为兼容兜底 - 在
ssl_ciphers中明确剔除所有静态 RSA 套件(如AES256-SHA、RSA),防止协商降级 - 限定协议为
TLSv1.2 TLSv1.3,禁用 TLSv1.1 及更低版本











