在 TLS 握手过程中,客户端和服务器需要协商用于密钥交换的数学群组(Named Groups)。这个过程直接影响连接的安全性和兼容性。本文详细介绍 Named Groups 的概念、类型以及在 OpenSSL 和 Nginx 中的配置方法。
什么是 Named Groups?#
Named Groups(命名组)是 TLS 协议中预先定义的一组数学参数,用于 (EC)DH 密钥交换。每个命名组对应一个具体的算法和参数组合,客户端和服务器通过名称协商使用哪个组进行密钥交换。
为什么 Named Groups 重要?#
- 安全性:不同的组提供不同的安全等级
- 兼容性:某些老旧系统只支持特定的组
- 性能:现代组(如 X25519)比传统组更高效
- 后量子安全:新的混合组支持量子抗性
组的类型#
TLS 密钥交换组主要分为两类:
1. FFDHE(有限域 Diffie-Hellman)#
基于传统离散对数难题,使用大整数模运算:
| 组名称 |
位数 |
安全等级 |
状态 |
| ffdhe2048 |
2048 |
112-bit |
推荐最低 |
| ffdhe3072 |
3072 |
128-bit |
推荐 |
| ffdhe4096 |
4096 |
192-bit |
高安全 |
| ffdhe6144 |
6144 |
192-bit+ |
极高安全 |
| ffdhe8192 |
8192 |
256-bit |
特殊需求 |
2. ECDHE(椭圆曲线 Diffie-Hellman)#
基于椭圆曲线密码学,相同安全级别下密钥更短:
| 组名称 |
曲线 |
安全等级 |
| x25519 |
Curve25519 |
128-bit |
| x448 |
Curve448 |
256-bit |
| secp256r1 |
NIST P-256 |
128-bit |
| secp384r1 |
NIST P-384 |
192-bit |
| secp521r1 |
NIST P-521 |
256-bit |
| brainpoolP256r1 |
Brainpool |
128-bit |
| brainpoolP384r1 |
Brainpool |
192-bit |
3. 混合后量子组(TLS 1.3)#
TLS 1.3 引入了混合后量子密钥交换:
| 组名称 |
组合 |
| x25519mlkem768 |
X25519 + ML-KEM-768 |
| x448mlkem1024 |
X448 + ML-KEM-1024 |
OpenSSL 配置方法#
1. 查看支持的组#
使用 OpenSSL 查看支持的命名组:
1
2
3
4
5
|
# 查看 OpenSSL 支持的 ECDH 曲线
openssl ecparam -list_curves | grep -E "secp|x25519|brainpool"
# 查看支持的 DH 组(需要查看源码或文档)
# OpenSSL 3.0+ 支持的组定义在 ssl/t1_lib.c 中
|
2. 使用 s_client 指定组#
测试不同组的连接:
1
2
3
4
5
6
7
8
|
# 优先使用 X25519
echo | openssl s_client -connect example.com:443 -groups x25519 2>&1
# 强制使用特定组
echo | openssl s_client -connect example.com:443 -groups secp256r1 2>&1
# 使用多个组(按优先级)
echo | openssl s_client -connect example.com:443 -groups x25519:secp384r1:secp256r1 2>&1
|
3. 通过配置文件设置默认组#
创建 OpenSSL 配置文件设置默认组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 创建配置文件
cat > /tmp/openssl_groups.cnf << 'EOF'
openssl_conf = openssl_init
[openssl_init]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
# TLS 1.3 组的优先级顺序
Groups = x25519:secp256r1:secp384r1
# 兼容 TLS 1.2 的曲线
Curves = x25519:secp256r1:secp384r1
EOF
# 使用自定义配置
OPENSSL_CONF=/tmp/openssl_groups.cnf openssl s_client -connect example.com:443 2>&1 | head -20
|
4. 编程中使用命名组#
在使用 OpenSSL API 时设置组:
1
2
3
4
5
6
7
8
9
10
|
// 设置允许的组(按优先级排序)
SSL_CTX_set1_groups(ctx, "x25519:secp384r1:secp256r1");
// 或使用列表形式
int groups[] = {
SSL_GROUP_X25519,
SSL_GROUP_SECP256R1,
SSL_GROUP_SECP384R1
};
SSL_CTX_set1_groups_list(ctx, groups, 3);
|
Nginx 配置方法#
1. 配置 TLS 1.3 密钥交换组#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/private.key;
# TLS 1.3 密钥交换组(按优先级排序)
ssl_groups x25519:secp256r1:secp384r1;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
}
|
2. 高级配置示例#
1
2
3
4
5
6
7
8
|
# 高安全配置(推荐)
ssl_groups x25519:secp384r1:secp521r1;
# 兼容旧客户端配置
ssl_groups x25519:secp256r1:secp384r1:brainpoolP256r1;
# 后量子混合配置(需要较新版本的 Nginx)
ssl_groups x25519mlkem768:secp256r1:x25519;
|
3. 查看 Nginx 支持的组#
1
2
3
4
5
|
# 查看 Nginx 编译时支持的组
nginx -V 2>&1 | grep -o "ssl_conf_option"
# 测试配置
nginx -t
|
安全建议#
推荐配置#
根据 Mozilla 的建议,生产环境推荐以下配置:
1
2
|
# 安全优先
ssl_groups x25519:secp384r1;
|
1
2
|
# 兼容性与安全性平衡
ssl_groups x25519:secp256r1:secp384r1;
|
避免使用#
- 非标准曲线:仅使用 RFC 定义的命名组
- 过小密钥:避免使用 secp160r1 等 160 位曲线
- 自定义 FFDHE:使用 RFC 7919 定义的 ffdhe 组
检查服务器配置#
使用以下命令检查目标服务器的密钥交换组:
1
2
3
4
5
|
# 使用 testssl 检查
testssl --keyexchanges example.com
# 使用 openssl 查看协商的组
echo | openssl s_client -connect example.com:443 -tls1_3 2>&1 | grep -i "group\|curve"
|
常见问题#
Q: X25519 相比 secp256r1 有什么优势?#
A: X25519(Curve25519)具有以下优势:
- 更快的计算速度
- 更简单的实现,减少错误
- 更小的密钥(32 字节 vs 32 字节,但计算更快)
- 更好的侧信道抵抗
Q: TLS 1.2 和 TLS 1.3 的组配置有什么不同?#
A:
- TLS 1.2 使用
ssl_curves 配置曲线
- TLS 1.3 使用
ssl_groups 配置组(包含 FFDHE 和 ECDH)
- Nginx 1.23+ 统一使用
ssl_groups
Q: 如何验证服务器配置的组是否生效?#
A: 使用 Wireshark 抓包查看 ServerHello 消息中的 Supported Groups 扩展,或使用 testssl --keyexchanges 工具。
Named Groups 配置是 TLS 安全的关键环节。生产环境建议:
- 优先使用 X25519——性能最佳,广泛支持
- 配置多个组作为备选——确保向后兼容
- 关注后量子发展——计划迁移到混合组
- 定期更新配置——跟随安全最佳实践
正确的组配置可以显著提升 TLS 连接的安全性和性能,同时保持与各版本客户端的兼容性。
参考来源