必须手动生成并配置ssl_dhparam,因Nginx不内置DH参数,复用1024位默认值或他人文件会削弱前向保密性、易遭Logjam攻击;推荐用openssl dhparam -out dhparam.pem 3072生成PEM格式参数,并在server块中正确引用。

直接配置 ssl_dhparam 是提升 TLS 前向保密性的关键一步,它不是“锦上添花”,而是防止 Logjam 等中间人攻击的必要措施。重点不在加不加,而在怎么生成、放哪、怎么验。
必须自己生成 DH 参数文件
别用系统默认或网上下载的 dhparam.pem——所有服务器共用同一组 DH 参数(尤其是 1024 位),等于把密钥交换的“底座”公开给攻击者,前向保密性就失效了。
- 1024 位 DH 参数已被证明可被国家级算力离线破解,必须淘汰
- OpenSSL 1.11.0+ 版本起,Nginx 不再内置 DH 参数,未配置即退回到不安全默认值
- 即使主要用 ECDHE,仍需提供强 DH 参数:旧版 Java、IoT 设备、嵌入式客户端可能协商 DHE 套件
用 OpenSSL 正确生成高强度参数
推荐使用标准 dhparam 命令,避开常见陷阱:
- 常规安全选择:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048(生成快、兼容广、满足主流合规) - 高敏场景(如金融、政务):
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072(抗长期算力进步,生成耗时但值得) - 绝对不要加
-dsaparam(例如openssl dhparam -dsaparam ...),它生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致部分客户端握手失败 - 避免 4096 位:生成极慢(数小时),Nginx 加载可能超时,实际安全增益有限
生成过程会消耗 CPU 和熵池,建议在维护窗口执行,或后台运行:nohup openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 &
在 Nginx 配置中精准加载
ssl_dhparam 指令必须写在启用 HTTPS 的 server 块内,顺序和权限直接影响生效与否:
- 放在
ssl_certificate和ssl_certificate_key之后,避免路径错误导致 Nginx 启动失败 - 推荐按站点配置(写在
server块里),而非全局http块,便于差异化管理 - 确保文件权限严格:
chmod 600 /etc/nginx/ssl/dhparam.pem,且 nginx worker 进程用户(如www-data或nginx)有读取权限
典型配置片段:
server {
listen 443 ssl;
server_name example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_dhparam /etc/nginx/ssl/dhparam.pem; # ← 放这里,且路径准确
...
}
修改后务必执行:nginx -t && nginx -s reload
上线后验证是否真正生效
配置成功 ≠ 安全落地,必须实测确认参数被正确加载且强度达标:
- 检查文件内容:
openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | grep "Prime:",输出应含3072 bit或2048 bit - 终端直连测试:
openssl s_client -connect example.com:443 -cipher 'DHE' 2>/dev/null | grep "Server Temp Key",应显示DH, 2048 bits或更高 - 用 SSL Labs 免费扫描(https://www.ssllabs.com/ssltest/):在 “Key Exchange” 栏确认显示 “DH 2048” 或 “DH 3072”,且标注 “Forward Secrecy: Yes”











