在 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 安全的关键环节。生产环境建议:

  1. 优先使用 X25519——性能最佳,广泛支持
  2. 配置多个组作为备选——确保向后兼容
  3. 关注后量子发展——计划迁移到混合组
  4. 定期更新配置——跟随安全最佳实践

正确的组配置可以显著提升 TLS 连接的安全性和性能,同时保持与各版本客户端的兼容性。


参考来源