# 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。
