1. 课程导入与工程全景
如果把今天互联网的安全底座拆开来看,会发现它几乎完全建立在三类经典公钥算法之上:用于密钥交换的 RSA/ECDH,用于身份认证的 RSA/ECDSA,以及用于完整性保护的哈希与对称加密。问题在于,这三类算法中承担"不可破解"承诺的部分,正在被量子计算逐步侵蚀。Shor 算法一旦在足够规模的量子计算机上运行,RSA、DH、ECDH、ECDSA 都会在多项式时间内被攻破;Grover 算法则把对称密钥的有效强度减半,AES-128 退化为约 64 位安全强度。这就是 PQC(Post-Quantum Cryptography,后量子密码)进入 TLS 的根本动机。
但"换算法"远不是把 RSA 替换成 ML-KEM 那么简单。TLS 是互联网上耦合最深的协议之一:它牵扯证书体系、握手状态机、扩展协商、中间盒兼容性、硬件加速、会话恢复、性能预算和合规审计。PQC 与 TLS 的混合部署,本质上是在不动摇现有信任链和可用性的前提下,把抗量子能力渐进地嵌入到握手与证书路径中。本课程要解决的,正是这条工程路径上的每一个具体决策点。
为什么是"混合",而不是"直接替换"
直接全量切换到纯 PQC 会带来两个现实风险。第一是算法风险:PQC 算法相对年轻,ML-KEM(原 Kyber)、ML-DSA(原 Dilithium)、SLH-DSA(原 SPHINCS+)虽然已被 NIST 标准化,但数学假设的长期安全性仍在被持续审视,一旦某个算法出现结构性弱点,纯 PQC 部署将没有退路。第二是兼容性风险:大量客户端、负载均衡、WAF、TLS 卸载卡和监控探针并不认识新的 NamedGroup 和签名算法,纯 PQC 握手会直接失败。
混合模式的核心思想是"两条腿走路":在密钥交换阶段同时执行经典 ECDHE 和 PQC KEM,把两个共享秘密拼接后再派生会话密钥;在认证阶段则根据对端能力选择经典证书或 PQC/混合证书。这样,攻击者必须同时攻破经典算法和 PQC 算法才能恢复会话密钥,安全性取两者之优,兼容性则通过协商降级得到保障。
shared_secret = HKDF-Extract( salt=0, IKM = X25519_shared || ML-KEM_shared )
只要 X25519 或 ML-KEM 任一未被攻破,会话密钥即不可恢复。
本节核心:一张图看清工程全景
下面这张图把本课程要覆盖的工程对象、数据流和交付物压缩到一张关系图中。左侧是输入侧的现实约束,中间是混合部署的三条并行工作流(密钥交换、身份认证、运维观测),右侧是最终交付物。图中每个节点都对应后续章节会展开的具体技术点。
课程目标与范围界定
本课程的目标不是培养密码学理论研究者,而是培养能把 PQC 安全、可控、可观测地落进现有 TLS 基础设施的工程师。具体来说,完成课程后你应当能够:
- 读懂 TLS 1.3 握手中与 PQC 相关的扩展字段(supported_groups、key_share、signature_algorithms),并判断一个客户端是否支持混合密钥交换;
- 在 OpenSSL 3.5+ / BoringSSL / 主流网关(Nginx、Envoy、HAProxy)上启用 X25519MLKEM768 等混合组,并验证协商结果;
- 设计从经典证书到混合证书再到纯 PQC 证书的迁移路径,处理交叉签名与信任锚问题;
- 建立握手字节数、CPU 开销、P99 延迟、失败率的观测基线,并据此设定灰度与回滚阈值;
- 识别 HNDL(Harvest Now, Decrypt Later)风险,对长期机密数据优先实施抗量子保护。
范围上,本课程聚焦TLS 1.3 之上的 PQC 混合部署,不展开 IPsec、SSH、S/MIME 的 PQC 迁移,也不深入格密码的数学证明。涉及算法时,以 NIST 已标准化的 ML-KEM(FIPS 203)、ML-DSA(FIPS 204)、SLH-DSA(FIPS 205)为准,同时会提到仍在使用但已非首选的 Kyber 参考实现与 X25519Kyber768 过渡组。
一个可执行的起点:混合部署检查清单
在进入后续章节前,建议先用下面这份清单盘点你当前的环境。它不追求覆盖全部细节,而是帮助你在动手前明确"我有什么、我缺什么"。
| 检查项 | 需要确认的内容 | 典型判断依据 |
|---|---|---|
| TLS 版本 | 服务端与客户端是否均支持 TLS 1.3 | 握手日志中出现 supported_versions = 0x0304 |
| 密码库版本 | OpenSSL ≥ 3.5 或 BoringSSL 已含 ML-KEM 实现 | openssl list -kem-algorithms 能看到 ML-KEM-768 |
| 卸载设备 | 负载均衡 / WAF 是否透传未知 NamedGroup | 抓包确认 key_share 未被丢弃或改写 |
| 证书体系 | CA 是否已支持 ML-DSA 签发或交叉签名 | CA 的 CPS 与算法支持列表 |
| 观测能力 | 能否按 NamedGroup 维度统计握手成功率与延迟 | 网关指标或 eBPF 抓取 ClientHello/ServerHello |
| 回滚开关 | 能否在不重启的情况下关闭混合组 | 配置热加载或灰度开关 |
openssl s_client -groups X25519MLKEM768 -connect host:443 观察握手是否成功,并对比 -groups X25519 时的握手字节数差异。ML-KEM-768 的公钥约 1184 字节、密文约 1088 字节,混合组会让 ClientHello 明显变大,这正是后续需要重点关注的性能变量。