2. PQC算法与证书标准基础

要把后量子密码(PQC)真正落到证书与PKI体系中,第一步不是改CA,而是先弄清三件事:NIST标准化了哪些算法、它们各自解决什么问题、以及这些算法在X.509证书里如何被编码和识别。本节围绕这三条主线展开,为后续的迁移工程建立“算法—用途—编码”的对应关系。

一、NIST PQC标准化的算法版图

NIST后量子密码标准化项目经过多轮筛选,形成了以“密钥封装/加密”和“数字签名”为两大支柱的算法集合。理解它们的关键,是区分基于格的算法与基于哈希、编码等其它数学难题的算法,因为不同数学基础直接决定了密钥尺寸、密文尺寸和性能特征。

  • ML-KEM(FIPS 203):原CRYSTALS-Kyber,基于模格上的MLWE问题,用于密钥封装(KEM)。它是当前PQC密钥交换的主力,提供ML-KEM-512/768/1024三档安全强度。
  • ML-DSA(FIPS 204):原CRYSTALS-Dilithium,同样基于格问题,用于数字签名,提供ML-DSA-44/65/87三档。
  • SLH-DSA(FIPS 205):原SPHINCS+,基于哈希函数,签名体积大但安全假设保守,适合作为“备份签名算法”。
  • FN-DSA(FIPS 206,原Falcon):基于NTRU格,签名紧凑但实现复杂,标准化进程相对靠后。

需要特别注意的是,KEM不能直接当签名用,签名算法也不能直接当KEM用。在PKI中,证书签名用ML-DSA或SLH-DSA,而TLS握手里的密钥交换用ML-KEM,两者是不同层面的替换。

二、混合密钥交换:过渡期的现实选择

在PQC算法尚未经过长期密码分析检验之前,业界普遍采用混合密钥交换:把传统ECDH与ML-KEM组合,只要其中一方不被攻破,会话密钥就仍然安全。典型组合是X25519+ML-KEM-768,在TLS 1.3中通过X25519MLKEM768这一命名组标识。

混合密钥交换的核心逻辑是:客户端和服务端各自生成两份共享秘密,一份来自ECDH,一份来自KEM,然后用KDF把两者拼接后派生会话密钥。这样即使未来量子计算机攻破ECDH,攻击者仍无法还原KEM部分;反之若KEM被发现有缺陷,ECDH仍提供保护。

混合模式不是“两个算法简单相加”,而是要在密钥派生时明确拼接顺序、长度和标签,否则双方计算结果不一致,握手会直接失败。

三、PQC签名算法在X.509中的编码要求

X.509证书的签名算法由signatureAlgorithm字段标识,该字段是一个AlgorithmIdentifier结构,包含OID和可选参数。PQC签名算法要进入证书,必须满足三个条件:有正式分配的OID、参数编码规则明确、且CA与验证方都支持该算法。

以ML-DSA为例,其OID为2.16.840.1.101.3.4.3.17(ML-DSA-44)、...18(ML-DSA-65)、...19(ML-DSA-87)。在证书中,签名值直接是ML-DSA签名比特串,参数字段通常为ABSENT。SLH-DSA的OID为2.16.840.1.101.3.4.3.20起,参数同样需要按FIPS 205规定处理。

另一个关键点是公钥编码。PQC公钥尺寸远大于RSA/ECC,例如ML-DSA-65公钥约1952字节,SLH-DSA公钥约32字节但签名约17088字节。这意味着证书体积会显著膨胀,CA在签发时必须考虑CRL、OCSP响应和TLS证书链的传输开销。

PQC算法—用途—X.509编码对应关系 NIST PQC 算法 ML-KEM FIPS 203 · 格 ML-DSA FIPS 204 · 格 SLH-DSA FIPS 205 · 哈希 FN-DSA FIPS 206 · NTRU 混合模式 X25519+ML-KEM 主要用途 密钥封装 / 密钥交换 TLS 握手共享秘密 数字签名 证书 / CRL / OCSP 签名 数字签名(保守) 根证书 / 长期签名 数字签名(紧凑) 受限环境签名 过渡期密钥交换 兼容传统与PQC X.509 编码要点 不直接进证书签名字段 用于 TLS 密钥交换,非证书签名 OID: 2.16.840.1.101.3.4.3.17~19 参数 ABSENT,签名值直接编码 OID: 2.16.840.1.101.3.4.3.20 起 签名体积大,注意链传输开销 OID 待 FIPS 206 正式发布 实现复杂度高,需谨慎评估 命名组: X25519MLKEM768 KDF 拼接顺序与标签需一致

四、证书链中的算法组合与迁移策略

实际迁移中,证书链往往不是“全PQC”或“全传统”,而是混合的。常见策略有三种:

  1. 双证书并行:同一主体同时持有传统证书和PQC证书,客户端根据能力选择。优点是兼容性好,缺点是管理复杂。
  2. 混合证书:一张证书里同时包含传统公钥和PQC公钥,签名用其中一种或两种。这需要扩展X.509结构,目前标准仍在演进。
  3. 分阶段替换:根证书先用SLH-DSA保持长期安全,中间CA和终端证书逐步过渡到ML-DSA。这是当前最务实的路径。

无论哪种策略,都必须回答一个工程问题:验证方是否支持新OID。如果客户端不识别ML-DSA的OID,证书链验证会直接失败。因此迁移前必须做能力探测,确认依赖库(如OpenSSL、BoringSSL、Go crypto)的版本是否已支持对应算法。

五、一个可操作的检查清单

在动手改CA之前,建议按以下清单逐项确认,避免“算法选对了但证书签不出来”的尴尬:

检查项确认内容示例/判断依据
算法OIDCA与验证方是否都识别目标OIDML-DSA-65: 2.16.840.1.101.3.4.3.18
参数编码AlgorithmIdentifier参数是否按规范置空或填值ML-DSA参数为ABSENT
密钥尺寸证书、CRL、OCSP响应体积是否可接受ML-DSA-65公钥约1952字节
签名尺寸TLS证书链是否超出对端缓冲限制SLH-DSA签名可达17KB以上
混合KEM命名TLS命名组是否双方一致X25519MLKEM768
KDF拼接共享秘密拼接顺序与标签是否统一先ECDH后KEM,长度前缀明确
不要假设“支持PQC的库”就一定能签PQC证书。很多库只实现了KEM用于TLS,签名算法和X.509编码支持是分开的,必须分别验证。

总结来看,PQC在PKI中的落地可以归纳为一条主线:ML-KEM负责密钥交换,ML-DSA/SLH-DSA负责签名,混合模式负责过渡,X.509的OID和参数编码负责让这一切被正确识别。掌握这条主线,后续的CA改造、证书模板调整和客户端兼容性测试才有明确的依据。