必须生成并配置自有的高强度dh参数文件,推荐用openssl dhparam -out /etc/nginx/dhparam.pem 3072生成,禁用-dsaparam和4096位,配置于server块内、权限设为600,并配合ecdhe套件与tlsv1.2+协议协同加固。

直接生成并加载高强度 DH 参数文件,是提升 Diffie-Hellman 密钥交换安全性的核心手段。它不加密数据本身,而是为 DHE 类密码套件筑牢参数基础——没有它,Nginx 很可能退回到 1024 位甚至更弱的默认 DH 组,Logjam 攻击可离线预计算破解。
必须用自己的 DH 参数,不能复用或跳过
从 Nginx 1.11.0 起已移除内置 DH 参数;系统 OpenSSL 或发行版自带的默认值常为 1024 位,已被证实可被国家级算力分解。网上下载的 dhparam.pem 文件看似省事,实则所有服务器共用同一组素数 p 和生成元 g,等于共享密钥交换底座,前向保密性大幅削弱。即使主要使用 ECDHE,仍需提供强 DH 参数——旧版 Java、IoT 设备、嵌入式客户端仍可能协商传统 DHE 套件。
生成推荐位长的参数文件
用 OpenSSL 命令行生成,避开常见误区:
-
常规生产环境推荐 3072 位:执行
openssl dhparam -out /etc/nginx/dhparam.pem 3072。兼顾长期安全性与握手性能,抵御未来算力进步,金融、政务类站点应优先采用 -
资源受限或快速上线可用 2048 位:执行
openssl dhparam -out /etc/nginx/dhparam.pem 2048。满足当前主流合规要求(如 PCI DSS、等保2.0),生成耗时通常在几十秒内 -
禁用 -dsaparam 参数:如
openssl dhparam -dsaparam ...生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致部分客户端(尤其是较老浏览器或特定中间件)握手失败 - 避免 4096 位:生成极慢(可能数小时),Nginx 加载时易触发超时,且安全增益边际递减,实际部署中极少采用
在 Nginx 中正确加载和验证
生成后需严格按规范配置,否则前向保密形同虚设:
-
放在 server 块内,位置靠后:确保写在
ssl_certificate和ssl_certificate_key之后;不建议放在 http 块顶层,除非所有站点共用同一参数 -
权限与路径要精准:文件权限设为
600(chmod 600 /etc/nginx/dhparam.pem),确认 nginx worker 进程用户(如 www-data)有读取权限 -
配置后务必测试生效:运行
nginx -t检查语法,再nginx -s reload热重载;用openssl dhparam -in /etc/nginx/dhparam.pem -text -noout | grep "prime"确认长度为 3072 或 2048 -
线上验证是否起效:通过 SSL Labs 扫描,查看 “Key Exchange” 是否显示 “DH 3072” 并标注 “Forward Secrecy: Yes”;或终端执行
openssl s_client -connect example.com:443 -cipher 'EDH' | grep "Server Temp Key",应输出类似Server Temp Key: DH, 3072 bits
配合加密套件与协议版本加固整体 TLS 安全
仅靠 ssl_dhparam 不足以构建完整防护,需协同优化:
-
强制启用前向保密套件:在配置中明确指定以
ECDHE为主的套件,例如:ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
并设置ssl_prefer_server_ciphers on; -
禁用老旧协议:只允许 TLSv1.2 及以上,明确关闭 TLSv1.0/TLSv1.1:
ssl_protocols TLSv1.2 TLSv1.3; -
启用 HSTS 防降级:添加响应头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;











