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

必须手动配置 ssl_dhparam,否则 Nginx 会回退到不安全的默认 DH 参数(多为 1024 位),前向保密失效,Logjam 类攻击可直接利用。
生成高强度 DH 参数文件
使用 OpenSSL 命令生成专属参数,避免复用他人文件或系统默认值——共用同一组 p/g 会破坏前向保密,等同于共享密钥交换地基。
- 推荐执行:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 3072 ——3072 位是当前安全与性能最优平衡点,抗算力升级能力强,生成耗时通常 1–3 分钟
- 资源受限或需快速上线时可用 2048 位:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048,仍满足 PCI DSS、等保2.0 等主流合规要求
- 禁用 4096 位:生成极慢(数小时),Nginx 加载易超时,且安全增益微乎其微
- 严禁加 -dsaparam 参数:它生成的是 DSA 兼容参数,不适用于标准 DH 密钥交换,会导致 Android 旧版本、OpenSSL 1.0.x 等客户端握手失败
在 Nginx 中正确加载 ssl_dhparam
该指令必须出现在启用 SSL 的 server 块内,且顺序和权限直接影响生效与否。
- 路径需明确指向 PEM 文件(如
/etc/nginx/ssl/dhparam.pem),不能放在http块顶层,除非所有 HTTPS 站点共用同一参数 - 必须置于
ssl_certificate和ssl_certificate_key之后,否则 Nginx 启动可能因路径错误失败 - 文件权限设为
600:chmod 600 /etc/nginx/ssl/dhparam.pem,确保仅属主可读,防止敏感参数泄露 - 确认 Nginx worker 进程用户(如
www-data或nginx)对该文件有读取权限
配合现代 TLS 配置协同生效
ssl_dhparam 单独存在无意义,必须与协议版本、密钥交换机制匹配才能发挥前向保密作用。
- 启用 TLSv1.2 及以上协议:
ssl_protocols TLSv1.2 TLSv1.3;,禁用 TLSv1.0/TLSv1.1 - 优先选用 ECDHE 套件(如
ECDHE-ECDSA-AES256-GCM-SHA384),同时保留 DHE 套件兼容旧客户端;没有强 DH 参数,DHE 就退化为弱交换 - 避免仅依赖证书自带 DH 参数(部分旧证书含 1024 位 DH),必须显式指定自生成文件
验证是否真正生效
配置完成后必须验证实际协商结果,而非仅检查配置语法。
- 终端测试:openssl s_client -connect example.com:443 -cipher 'EDH' | grep "Server Temp Key",输出应为
Server Temp Key: DH, 3072 bits - 在线扫描:用 SSL Labs 工具检测,Key Exchange 栏应显示
DH 3072且标注Forward Secrecy: Yes - 文件校验:openssl dhparam -in /etc/nginx/ssl/dhparam.pem -text -noout | head -n 5,确认 Prime(P) 长度匹配所选位数











