dhparam 是干什么的
dhparam 用来生成有限域 DH(DHE)参数文件,供那些使用 DHE 套件的服务端加载。生成过程要搜索安全素数,位数越大耗时越长,2048 位在普通机器上就可能要几分钟。现在的实践更倾向优先使用 ECDHE,需要 DHE 时直接用 RFC 7919 定义的命名群(FFDHE)即可,不必自己生成参数——TLS 1.3 更是取消了自定义 DH 参数,只允许命名群。
基本信息
| 生成 | openssl dhparam -out dhparam.pem 2048(耗时较长) |
|---|---|
| 查看 | openssl dhparam -in dhparam.pem -text -noout 的前几行即位数 |
| 复用 | 同一套参数可被多站点复用,不必重复生成 |
| 推荐做法 | 优先 ECDHE;需要 DHE 时使用 RFC 7919 命名群 |
| nginx 配置 | ssl_dhparam 指向参数文件 |
| TLS 1.3 | 只允许命名群,自定义参数不再参与协商 |
典型使用场景
- 兼容老旧客户端:少数只支持 DHE 的客户端需要服务端具备 DH 参数。
- 安全基线整改:清理仍在使用的 1024 位参数。
- 能力排查:确认某台 nginx 的 DHE 套件是否真的可用。
- 性能对比:DH 参数越大握手越慢,需要与兼容性权衡。
- 迁移评估:从自建参数切到命名群前,先确认两端都支持。
生成与配置
生成与配置
# 生成 2048 位参数(后台跑,耗时可能数分钟)
openssl dhparam -out /etc/nginx/dhparam.pem 2048
# 确认参数位数
openssl dhparam -in /etc/nginx/dhparam.pem -text -noout | head -1
# nginx 中引用:ssl_dhparam /etc/nginx/dhparam.pem;
# 生成后先 nginx -t 再 reload,避免配置错误导致服务起不来位数与取舍
| 位数 | 生成耗时量级 | 适用判断 |
|---|---|---|
| 1024 | 数秒 | 已低于当前实践要求,应替换 |
| 2048 | 数分钟 | 当前常见最低要求 |
| 3072 及以上 | 明显更长 | 握手开销上升,非必要不用 |
| 命名群(FFDHE) | 无需生成 | 首选方案,实现内置且互操作性好 |
生成参数会占用 CPU 且耗时长,建议离线生成一次并在多台服务器间复用同一文件;换成 ECDHE 优先的配置后,这份文件更多只是兼容保留。
生成完成后建议做一次参数校验再投入配置:OpenSSL 1.1.0 起 dhparam 提供 -check 选项,可在 reload 之前发现文件被截断或格式损坏的问题。
位数选择要看两端的实际支持:部分老旧客户端不认 3072 位以上的自定义参数,出现握手失败时先在测试环境用 s_server 复现,再决定降到 2048 位还是改走命名群。