# 04. CRL(Resource Certificate Revocation List) ## 4.1 对象定位 RPKI CA 必须发布符合 profile 的 CRL,用于声明其签发且未过期证书中的撤销集合。RFC 6487 §5。 RFC 9829 更新了 RFC 6487 对 CRL Number 以及 “current CRL” 识别的处理规则。RFC 9829 §3。 ## 4.2 原始载体与编码 - 载体:X.509 CRL。 - 编码:DER(遵循 RFC 5280 的 CRL 结构与字段语义,但受 RPKI profile 限制)。RFC 6487 §5(“consistent with RFC 5280”)。 ### 4.2.1 X.509 v2 CRL 基本语法(ASN.1;RFC 5280 §5.1) CRL 在编码层面是 RFC 5280 定义的 `CertificateList`(DER)。RFC 5280 §5.1。 ```asn1 CertificateList ::= SEQUENCE { tbsCertList TBSCertList, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING } TBSCertList ::= SEQUENCE { version Version OPTIONAL, -- if present, MUST be v2 signature AlgorithmIdentifier, issuer Name, thisUpdate Time, nextUpdate Time OPTIONAL, revokedCertificates SEQUENCE OF SEQUENCE { userCertificate CertificateSerialNumber, revocationDate Time, crlEntryExtensions Extensions OPTIONAL -- if present, version MUST be v2 } OPTIONAL, crlExtensions [0] EXPLICIT Extensions OPTIONAL -- if present, version MUST be v2 } ``` > 注:`Version`/`Time`/`CertificateSerialNumber`/`Extensions` 的定义在 RFC 5280 §4.1;`AlgorithmIdentifier` 的定义在 RFC 5280 §4.1.1.2(RFC 5280 §5.1 的注释段落给出引用)。 ### 4.2.2 CRL 扩展中常用内层结构(ASN.1;RFC 5280 §4.2.1.1;RFC 5280 §5.2.3) RPKI profile(经 RFC 9829 更新)要求 CRL **仅允许**两个扩展:AKI 与 CRL Number。RFC 9829 §3.1。 ```asn1 id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } AuthorityKeyIdentifier ::= SEQUENCE { keyIdentifier [0] KeyIdentifier OPTIONAL, authorityCertIssuer [1] GeneralNames OPTIONAL, authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } KeyIdentifier ::= OCTET STRING id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } CRLNumber ::= INTEGER (0..MAX) ``` ## 4.3 抽象数据模型(接口) ### 4.3.0 `Asn1TimeUtc`(X.509 `Time` 的抽象) X.509 中的 `Time` 是一个 CHOICE,可用 `UTCTime` 或 `GeneralizedTime` 编码;但在语义层面都表达一个 UTC 时间点。RFC 5280 §4.1.2.5;RFC 5280 §5.1.2.4。 因此在抽象模型中,将 `Time` 规范化为 “UTC 时间点 + 原始编码形态”: | 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 | |---|---|---|---|---| | `utc` | `UtcTime` | 规范化后的 UTC 时间点 | 从 `UTCTime`/`GeneralizedTime` 解码并转换为 UTC 时间点 | RFC 5280 §4.1.2.5.1;RFC 5280 §4.1.2.5.2 | | `encoding` | `enum{UTCTime, GeneralizedTime}` | 原始编码类型 | 需要保留编码形态以支持 profile 的编码约束校验 | RFC 5280 §5.1.2.4;RFC 5280 §5.1.2.5 | ### 4.3.1 `RpkixCrl` | 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 | |---|---|---|---|---| | `raw_der` | `DerBytes` | CRL DER | 原样保留(建议) | RFC 6487 §5 | | `version` | `int` | CRL 版本 | MUST 为 v2;RP 不要求处理 v1 | RFC 6487 §5 | | `issuer_dn` | `RpkixDistinguishedName` | CRL issuer | issuer DN 约束同证书 issuer(CN/serialNumber 规则) | RFC 6487 §5(引用 §4.4) | | `signature_algorithm` | `Oid` | CRL 签名算法 | 必须为 `sha256WithRSAEncryption`(`1.2.840.113549.1.1.11`) | RFC 6487 §5;RFC 7935 §2(引用 RFC 4055) | | `this_update` | `Asn1TimeUtc` | 本次 CRL 生成时间 | X.509 `Time`(UTCTime/GeneralizedTime)解码为 UTC 时间点,并保留原始编码形态 | RFC 5280 §5.1.2.4;RFC 5280 §4.1.2.5 | | `next_update` | `Asn1TimeUtc` | 下次 CRL 计划时间 | **MUST present**(尽管 ASN.1 标注 OPTIONAL);解码同 `this_update` | RFC 5280 §5.1.2.5 | | `revoked_certs` | `list[RevokedCert]` | 撤销条目 | 仅包含未过期且已撤销证书 | RFC 6487 §5 | | `extensions` | `CrlExtensions` | CRL 扩展 | **仅允许** AKI 与 CRL Number 两个扩展 | RFC 9829 §3.1(更新 RFC 6487 §5) | ### 4.3.2 `RevokedCert` | 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 | |---|---|---|---|---| | `serial_number` | `int` | 被撤销证书序列号 | 必须存在 | RFC 6487 §5 | | `revocation_date` | `Asn1TimeUtc` | 撤销时间 | X.509 `Time` 解码为 UTC 时间点,并保留原始编码形态;revocationDate 的表达规则同 `thisUpdate` | RFC 6487 §5;RFC 5280 §5.1.2.6(引用 §5.1.2.4) | | `entry_extensions` | `None` | 条目扩展 | CRL entry extensions MUST NOT present | RFC 6487 §5 | ### 4.3.3 `CrlExtensions` | 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 | |---|---|---|---|---| | `authority_key_identifier` | `bytes` | AKI.keyIdentifier | **extnID=`2.5.29.35`**;RP MUST 处理 AKI;CRL 扩展仅允许 AKI 与 CRLNumber | RFC 9829 §3.1;RFC 5280 §5.2.1 | | `crl_number` | `int` | CRLNumber | **extnID=`2.5.29.20`**;RP 必须忽略其排序语义;仅检查 non-critical 且数值范围:0..2^159-1 | RFC 9829 §3.1(引用 RFC 5280 §5.2.3) | ## 4.4 字段级约束清单(实现对照) - CA 必须签发 version 2 CRL;RP 不要求处理 v1。RFC 6487 §5。 - CRL 不得包含 Indirect CRL 或 Delta CRL。RFC 6487 §5。 - CRL 范围必须覆盖该 CA 签发的全部证书。RFC 6487 §5。 - `nextUpdate` MUST present(尽管 ASN.1 标注 OPTIONAL)。RFC 5280 §5.1.2.5。 - 时间编码规则(`thisUpdate`/`nextUpdate`/`revocationDate`):2049(含)及之前必须用 `UTCTime`;2050(含)及之后必须用 `GeneralizedTime`;应用必须能处理两者。RFC 5280 §5.1.2.4;RFC 5280 §5.1.2.5;RFC 5280 §5.1.2.6(引用 §5.1.2.4)。 - 只允许两个 CRL 扩展:AKI 与 CRLNumber;除此之外不允许任何 CRL 扩展。RFC 9829 §3.1。 - RP 必须处理 AKI;CRLNumber 仅做 “non-critical + 数值范围” 检查并忽略其它语义。RFC 9829 §3.1。 - 每个撤销条目仅允许 Serial Number 与 Revocation Date;不允许条目扩展。RFC 6487 §5。 ## 4.5 CRL 验签与绑定校验(验证阶段) > 本节描述“基于已解析的数据对象对 CRL 做签名校验(cryptographic signature validation)”所需输入与处理步骤。其定位属于验证阶段(而非纯解码阶段)。 ### 4.5.1 验签所需输入 - **CRL 对象本身**:包含 `tbsCertList`(待签名数据)、`signatureAlgorithm`、`signatureValue`。RFC 5280 §5.1。 - **CRL issuer 的 CA 证书(或其公钥)**:用于提供验签公钥(`SubjectPublicKeyInfo`)。RFC 5280 §6.3.3 (f)-(g)。 - (链路上下文)用于验证 issuer CA 证书链的同一信任锚(trust anchor):CRL issuer 的证书链必须与目标证书使用同一信任锚。RFC 5280 §6.3.3 (f)。 ### 4.5.2 绑定与一致性校验(推荐最小集合) 在执行签名验签之前,RP 通常应进行下列绑定校验以确保“用的是正确的 issuer 证书/公钥”: 1. **Issuer DN 匹配**:`CRL.issuer_dn` 必须等于 issuer CA 证书的 `subject`。RFC 5280 §5.1(`issuer` 字段);RFC 5280 §6.3.3 (b)(“verify that the CRL issuer matches the certificate issuer” 的一般化要求)。 2. **AKI ↔ SKI 绑定**:若 issuer CA 证书包含 `SubjectKeyIdentifier`(SKI,OID `2.5.29.14`),则其值应与 CRL 的 `AuthorityKeyIdentifier.keyIdentifier`(AKI,OID `2.5.29.35`)匹配。RFC 5280 §4.2.1.1;RFC 5280 §4.2.1.2;RFC 5280 §6.3.3 (c)(3)(delta 与 complete CRL 的 AKI 匹配规则;在非 delta 场景下同样用于选择正确的签发者公钥)。 3. **KeyUsage 约束**:若 issuer CA 证书存在 `KeyUsage` 扩展(OID `2.5.29.15`),则必须包含 `cRLSign` 位。RFC 5280 §4.2.1.3;RFC 5280 §6.3.3 (f)。 > 注:SKI 的生成算法在 RFC 5280 中不强制限定(不同 CA 可能采用不同方式生成 keyIdentifier);因此一般做“字节值匹配”,而不对 SKI 值做“从公钥推导再比对”的强校验。 ### 4.5.3 签名验签 完成上述绑定后,使用 issuer CA 证书提供的公钥对 CRL 签名进行验签: - 使用 issuer 的 `SubjectPublicKeyInfo` 验证 `signatureValue` 是对 `tbsCertList` 的正确签名。RFC 5280 §6.3.3 (g)。 - RPKI profile 限定签名算法为 `sha256WithRSAEncryption`(OID `1.2.840.113549.1.1.11`),并要求算法参数编码符合 X.509/PKIX 约束(常见为 absent 或 NULL)。RFC 6487 §5;RFC 7935 §2;RFC 5280 §4.1.1.2。