# DH 参数是什么？定义、例子与常见误区

> DH 参数是定义有限域 Diffie-Hellman 群的大素数模数和生成元，TLS 服务器要提供 DHE 密码套件就必须配置它。

Source: https://ssl.sh/zh/glossary/dh-parameters/
Last updated: 2026-11-10

DH 参数定义了有限域 [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/) 所用的群：一个大素数模数 p 和一个生成元 g。在 TLS 1.2 中，群由服务器选择，并在 ServerKeyExchange 消息里把 p 和 g 发给客户端，所以它属于服务器配置，通常是用 `openssl dhparam` 生成的 PEM 文件。TLS 1.3 不再允许任意群，有限域 DH 只能使用 RFC 7919 中的命名群 ffdhe2048 至 ffdhe8192。

## 为什么重要
2015 年的 [Logjam](https://ssl.sh/zh/glossary/logjam/) 攻击表明，512 位出口级群可被实时破解，被大量服务器共用的 1024 位群也是现实可行的预计算目标，此后 2048 位成为底线。DH 参数只影响 DHE 套件，对使用命名曲线的 [ECDHE](https://ssl.sh/zh/glossary/ecdhe/) 毫无作用，而且如今很多配置干脆不启用 DHE。Nginx 中如果没有设置 ssl_dhparam，就不会使用 DHE 套件。安全扫描提示"DH 参数过小"时，要么换成 2048 位以上的参数，要么直接去掉 DHE 套件。

## 例子
生成 2048 位参数并在 Nginx 中加载：

```bash
openssl dhparam -out /etc/nginx/dhparam.pem 2048
```

```nginx
ssl_dhparam /etc/nginx/dhparam.pem;
```

生成过程需要寻找安全素数，可能要等一会儿。

## 常见误区
- **每台 HTTPS 服务器都需要 dhparam 文件。** 只有提供 DHE 套件的服务器才需要，纯 ECDHE 和 TLS 1.3 连接都用不到它。
- **自己生成的参数比标准群更安全。** RFC 7919 中经过审查的 ffdhe2048 等标准群完全可以使用，Logjam 的教训在于群太小。
- **4096 位一定更好。** 群越大，每次 DHE 握手越慢，相比 2048 位带来的实际收益很有限。

## 相关术语

- [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/): Diffie-Hellman 是 1976 年提出的密钥协商方法，让通信双方在公开信道上各自算出相同的共享秘密，而无需传输这个秘密本身。
- [ECDHE](https://ssl.sh/zh/glossary/ecdhe/): ECDHE 是椭圆曲线上的临时 Diffie-Hellman 密钥交换，TLS 双方每次握手都生成新的椭圆曲线密钥对，并据此协商出共享密钥。
- [Logjam](https://ssl.sh/zh/glossary/logjam/): Logjam 是 2015 年公布的攻击（CVE-2015-4000），可把 TLS 降级到 512 位出口级 Diffie-Hellman，并威胁使用过小或被大量共用 DH 参数的服务器。
- [密钥交换](https://ssl.sh/zh/glossary/key-exchange/): 密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤，保护连接的对称密钥都由这个共享秘密派生而来。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [OpenSSL](https://ssl.sh/zh/glossary/openssl/): OpenSSL 是开源密码学工具包，由 TLS 协议库 libssl、通用密码库 libcrypto 和 openssl 命令行工具组成。
