背景:量子计算威胁与 TLS

量子计算机的快速发展对现有加密体系构成了潜在威胁。Shor 算法能够在多项式时间内分解大整数和计算离散对数,这意味着当前的 RSA、ECDSA 等公钥密码系统将可能被破解。SSL/TLS 协议中依赖的密钥交换和数字签名都可能受到影响。

虽然大规模量子计算机尚未出现,但"现在收集,以后解密"(harvest now, decrypt later)攻击已经是一种现实威胁 —— 攻击者可以预先收集加密流量,等待量子计算机足够强大时进行解密。

面对这一威胁,TLS 协议社区开发了混合密钥交换(Hybrid Key Exchange)方案,在传统算法基础上叠加后量子算法,实现"双重保险"。

什么是混合密钥交换

混合密钥交换同时使用两种不同的密钥交换算法,将其结果组合生成最终的会话密钥:

1
最终密钥 = HKDF(传统密钥交换结果 || 后量子密钥交换结果)

这种方案的优势在于:

  • 兼容性:至少一个算法是传统经典算法,确保与旧系统兼容
  • 安全性:即使量子计算机破解了其中一种算法,攻击者仍无法获得完整密钥
  • 渐进性:可以逐步在网络中部署后量子算法

X25519MLKEM768 详解

X25519MLKEM768 是 TLS 1.3 中最常用的混合密钥交换组合:

组件 类型 算法
X25519 传统 Curve25519 ECDH
ML-KEM-768 后量子 Kyber-768 (NIST Level 3)

X25519

X25519 是基于 Curve25519 曲线的椭圆曲线 Diffie-Hellman 密钥交换协议,目前被广泛使用。它提供 128 位的安全强度,已被包括 Apple、Google 在内的主要厂商采用。

ML-KEM-768

ML-KEM(Module-Lattice-Based Key-Encapsulation Mechanism)是 NIST 后量子密码学标准中的密钥封装机制,基于 Kyber 算法。它提供约 192 位的安全强度(NIST Level 3),能够抵抗量子计算机攻击。

组合原理

在 TLS 1.3 握手过程中,X25519MLKEM768 的工作流程如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
客户端发送:
- X25519 公钥(ClientKeyShare 中的 x25519 密钥共享)
- ML-KEM 公钥(ClientKeyShare 中的 kyber768 密钥共享)

服务器响应:
- X25519 密钥共享
- ML-KEM 密钥共享

双方各自计算:
- traditional_secret = X25519(客户端公钥, 服务器私钥)
- quantum_secret = ML-KEM_Encapsulate(客户端公钥, 服务器私钥)
- handshake_secret = HKDF-Extract(traditional_secret || quantum_secret)

这种设计确保了即使量子计算机能够破解 X25519,也无法破解完整的握手密钥,因为还需要 ML-KEM 的密钥材料。

支持状态

截至 2026 年,以下软件已支持 X25519MLKEM768:

软件 支持版本
OpenSSL 3.2.0+
Nginx 1.26.0+ (配合 OpenSSL 3.2+)
BoringSSL Chrome 131+
Apple Secure Transport iOS 26+, macOS 26+
Go 1.24+ (实验性)

Apple 已在 iOS 26 和 iPadOS 26 中将 X25519MLKEM768 作为 TLS 1.3 的默认密钥交换算法,这是业界首次大规模部署后量子 TLS。

OpenSSL 配置示例

OpenSSL 3.2+ 支持使用 X25519MLKEM768 混合密钥交换。

检查支持

1
2
# 查看支持的曲线(需要 OpenSSL 3.2+)
openssl ecparam -list_curves | grep -i "x25519mlkem"

启用混合密钥交换

在客户端配置中,可以通过 groups 参数启用:

1
2
3
# 使用 s_client 测试连接到支持混合密钥交换的服务器
openssl s_client -connect example.com:443 \
  -groups x25519mlkem768

查看服务器支持的密钥交换组

1
2
3
# 分析 ServerKeyShare 中的密钥交换组
openssl s_client -connect example.com:443 \
  -debug -state 2>&1 | grep -i "key share"

Nginx 配置示例

Nginx 1.26+ 配合 OpenSSL 3.2+ 可以启用 X25519MLKEM768 支持。

在 Nginx 配置中启用后量子密钥交换:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;

    # 启用 TLS 1.3
    ssl_protocols TLSv1.3;

    # 配置密钥交换组,优先使用混合密钥交换
    # 注意:需要 OpenSSL 3.2+ 支持
    ssl_groups x25519mlkem768:secp256r1:x25519;

    ssl_prefer_server_ciphers on;
    ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
}

配置说明

  • ssl_groups:指定允许的密钥交换组,按优先级排序
  • x25519mlkem768:最高优先级,启用混合密钥交换
  • 如果客户端不支持,服务器会自动回退到传统算法(如 secp256r1)

测试验证

使用 testssl.sh

1
2
# 检测服务器是否支持混合密钥交换
testssl --standard example.com | grep -i "kyber\|mlkem\|hybrid"

使用 openssl 查看握手

1
2
3
4
# 查看详细的握手过程
openssl s_client -connect example.com:443 \
  -tls1_3 -groups x25519mlkem768 \
  -msg 2>&1 | grep -A 5 "Key Share"

如果配置成功,你应该能在 ClientHello 和 ServerHello 中看到两个密钥共享(X25519 和 ML-KEM)。

注意事项

性能考虑

ML-KEM 的计算成本高于传统 ECDH。在性能敏感的场景中,可以考虑:

  • 仅对高安全需求的端点启用混合密钥交换
  • 使用硬件加速(如支持 ML-KEM 的 CPU 指令)

兼容性

混合密钥交换目前仍处于早期部署阶段。如果服务器启用后量子算法但客户端不支持,握手会回退到传统算法。建议监控握手成功率,确保回退机制正常工作。

长期安全

X25519MLKEM768 提供约 256 位的安全强度(传统 128 位 + 后量子 128 位),能够满足长期安全需求。如果未来出现更强大的量子计算机,可以通过升级到更高安全级别的后量子算法(如 ML-KEM-1024)来应对。

总结

后量子 TLS 已成为 TLS 安全的必然演进方向。X25519MLKEM768 混合密钥交换方案通过结合传统 ECDH 和后量子 ML-KEM,在保证兼容性的同时提供对抗量子计算攻击的能力。

随着 Apple 在 iOS 26 中默认启用这一技术,预计主流浏览器和服务器将加速支持。提前了解和学习这一技术,有助于在量子计算时代到来前做好安全准备。


参考来源