DH 参数 (dhparam,Diffie-Hellman 群参数)
定义
DH 参数是定义有限域 Diffie-Hellman 群的大素数模数和生成元,TLS 服务器要提供 DHE 密码套件就必须配置它。
DH 参数定义了有限域 Diffie-Hellman 所用的群:一个大素数模数 p 和一个生成元 g。在 TLS 1.2 中,群由服务器选择,并在 ServerKeyExchange 消息里把 p 和 g 发给客户端,所以它属于服务器配置,通常是用 openssl dhparam 生成的 PEM 文件。TLS 1.3 不再允许任意群,有限域 DH 只能使用 RFC 7919 中的命名群 ffdhe2048 至 ffdhe8192。
为什么重要
2015 年的 Logjam 攻击表明,512 位出口级群可被实时破解,被大量服务器共用的 1024 位群也是现实可行的预计算目标,此后 2048 位成为底线。DH 参数只影响 DHE 套件,对使用命名曲线的 ECDHE 毫无作用,而且如今很多配置干脆不启用 DHE。Nginx 中如果没有设置 ssl_dhparam,就不会使用 DHE 套件。安全扫描提示"DH 参数过小"时,要么换成 2048 位以上的参数,要么直接去掉 DHE 套件。
例子
生成 2048 位参数并在 Nginx 中加载:
openssl dhparam -out /etc/nginx/dhparam.pem 2048
ssl_dhparam /etc/nginx/dhparam.pem;
生成过程需要寻找安全素数,可能要等一会儿。
常见误区
- 每台 HTTPS 服务器都需要 dhparam 文件。 只有提供 DHE 套件的服务器才需要,纯 ECDHE 和 TLS 1.3 连接都用不到它。
- 自己生成的参数比标准群更安全。 RFC 7919 中经过审查的 ffdhe2048 等标准群完全可以使用,Logjam 的教训在于群太小。
- 4096 位一定更好。 群越大,每次 DHE 握手越慢,相比 2048 位带来的实际收益很有限。