后量子密码(Post-Quantum Cryptography,PQC)正在从论文走向生产环境。随着“先收集、后解密”(Harvest Now, Decrypt Later)被证实已是现实威胁——攻击者可以先把今天抓取的 TLS 流量存下来,等量子计算机成熟后再解密——对需要长期保密的业务而言,把密钥交换迁移到后量子算法已不是“要不要做”,而是“什么时候做”。本文给出从版本核查到 Nginx 落地的完整配置方案。
适用场景
- 金融、政务、医疗等数据传输需要长期保密(10 年以上)的业务系统
- 已启用 TLS 1.3,希望在不破坏现有兼容性的前提下引入后量子算法
- 需要响应监管对“抗量子迁移路线”的合规要求
前置条件
- OpenSSL 3.5.0 及以上(内置 ML-KEM 实现)
- Nginx 1.29.0 及以上(或带 PQC 补丁的 1.27)
- 客户端:Chrome 131+、Firefox 132+ 已默认开启 X25519MLKEM768
- 服务器已启用 TLS 1.3,具备 root 或 sudo 权限
原理说明
TLS 1.3 的密钥交换目前主流是 ECDHE,基于椭圆曲线离散对数难题。量子计算机上的 Shor 算法可在多项式时间内求解该难题,因此 ECDHE 在量子时代不再安全。后量子密码改用格(Lattice)难题,标准算法是 NIST 2024 年正式发布的 ML-KEM(原 Kyber)。
直接只用 ML-KEM 有两个问题:一是缺乏长期真实世界验证,二是旧客户端不支持会导致握手失败。因此生产环境采用混合模式:把 X25519 与 ML-KEM-768 的密钥交换结果拼接生成共享密钥,只要其中一种不被攻破,会话就安全。Chrome 与 OpenSSL 采用的混合曲线标识符为 X25519MLKEM768。
为什么必须“混合”而不是“直接替换”
后量子算法的数学基础(格问题)与 ECDHE(椭圆曲线离散对数)完全不同,属于正交的安全性假设:一旦未来某类算法被发现有效攻击,另一种依然是未知难题。NIST 在 2024 年 8 月正式发布三项后量子标准:用于密钥封装的 FIPS 203(ML-KEM)、用于数字签名的 FIPS 204(ML-DSA,原 Dilithium)与 FIPS 205(SLH-DSA,原 SPHINCS+)。这意味着 TLS 生态需要同时迁移密钥交换与证书签名两条链路。
HNDL 威胁的时间窗口是判断迁移紧迫性的核心依据:如果一份数据的保密期是 10 年,而量子计算机可能在 8 年后具备破解能力,那么今天抓取的密文在 8 年后就会被解开,保密期实际已被击穿。这类数据必须现在就完成密钥交换迁移;而签名迁移(证书)的紧迫性略低,因为伪造签名需要有量子能力之后才成立,不具备回溯特性。
操作步骤
第一步:核查 OpenSSL 版本
openssl version -a | head -1
# 期望输出:OpenSSL 3.5.0 或更高
openssl list -kem-algorithms | grep -i ml-kem
第二步:确认 Nginx 编译的 OpenSSL
nginx -V 2>&1 | tr ' ' '\n' | grep -i openssl
# 若显示的 OpenSSL 版本低于 3.5,需重新编译 Nginx 并链接新版 OpenSSL
第三步:配置 Nginx 混合密钥交换
# /etc/nginx/conf.d/pqc.conf
ssl_protocols TLSv1.2 TLSv1.3;
# 把后量子混合曲线放在第一位,优先协商
ssl_ecdh_curve X25519MLKEM768:X25519:secp256r1;
ssl_prefer_server_ciphers on;
关键点:ssl_ecdh_curve 的顺序即优先级,把 X25519MLKEM768 放最前,Nginx 会优先选择该曲线;对不支持的客户端自动回退到 X25519 或 secp256r1,不会中断握手。
第四步:重载并验证协商结果
nginx -t && nginx -s reload
# 主动指定混合曲线发起握手
openssl s_client -connect www.example.com:443 -groups X25519MLKEM768 -tls1_3 </dev/null 2>/dev/null | grep -i "Group"
看到 Group: X25519MLKEM768 即表示协商成功。若输出的是 X25519,说明客户端未提供混合曲线或 Nginx 未正确加载新版 OpenSSL。
第五步(可选):评估证书签名迁移
证书签名使用的是数字签名算法,与密钥交换不属于同一层,可以分阶段推进:
# 查看当前证书签名算法
openssl x509 -in server.crt -noout -text | grep -i "Signature Algorithm"
# 现状通常为 sha256WithRSAEncryption / ecdsa-with-SHA256
# 后量子签名将过渡到 ML-DSA(FIPS 204)
目前主流 CA 尚未大规模签发后量子证书,因此现阶段先完成密钥交换迁移,签名迁移列入后续路线图,二者不必同步上线。
配置验证
- 用
openssl s_client -groups X25519MLKEM768确认服务端接受该曲线 - 用旧客户端(如 OpenSSL 1.1.1)连接,确认能自动降级到 X25519,业务不中断
- 抓包观察 ClientHello 的 key_share 扩展是否包含 Hybrid 方案
- 对比迁移前后握手耗时:
curl -w "%{time_appconnect}\n" -o /dev/null -s https://www.example.com/
部署注意事项
- 灰度优先:先在一台边缘节点或测试域名启用,观察一周握手成功率与耗时曲线,再逐步放量。
- 关注中间设备:部分老旧负载均衡、反向代理与防火墙会解析 ClientHello,遇到超大 key_share 可能丢弃握手,需提前验证完整链路。
- CDN/WAF 协同:若源站前有 CDN,最终用户的 TLS 由 CDN 边缘终结,后量子握手能否生效取决于 CDN 是否已支持;源站配置对终端用户不可见,排查时不要只看源站。
- 会话票据:TLS 1.3 会话复用(PSK)可显著降低重复握手开销,建议同步开启
ssl_session_cache与ssl_session_tickets。
常见问题
FAQ 1:启用后量子握手会不会显著增加延迟?
ML-KEM 的密钥体积比 X25519 大(公钥约 1184 字节),会多出一次 TCP 分段往返,握手延迟通常增加 1 个 RTT 以内。对首次连接影响可感知,但 TLS 1.3 会话复用后开销可忽略。建议先在小流量域名灰度,观察握手耗时指标再全量。
FAQ 2:旧客户端会不会握手失败?
不会。混合模式的本质是“兼容优先”:客户端若不支持 X25519MLKEM768,服务端会自动回退到 X25519。前提是 ssl_ecdh_curve 中必须保留 X25519 和 secp256r1 作为兜底,不要只写一种曲线。
FAQ 3:如何判断我的业务是否属于 HNDL 高风险?
判断依据是“数据保密期”与“量子能力成熟时间”的交叉。保密期越长(如身份档案、医疗记录、长期商业机密)风险越高;实时性数据(如一次会话的临时令牌)风险较低。高风险业务应把密钥交换迁移列为一优先级任务,而不是等标准完全成熟再动手。
总结
后量子密码迁移的核心思路是“混合过渡、兼容优先”:先用 X25519MLKEM768 混合曲线在 TLS 层抗住 HNDL 威胁,再随生态成熟逐步推进到纯后量子算法与后量子签名证书。落地成本极低——一次版本核查、一行配置、一次重载即可完成,风险可控,收益却面向未来十年。建议尽早纳入加密资产治理路线图。