159 lines
8.2 KiB
Markdown
159 lines
8.2 KiB
Markdown
# 05. RPKI Signed Object(CMS SignedData 外壳)
|
||
|
||
## 5.1 对象定位
|
||
|
||
ROA、Manifest 等都属于 “RPKI Signed Object”,其外壳是 CMS SignedData,并受 RFC 6488 的 profile 约束;RFC 9589 进一步更新了 `signedAttrs` 的要求。RFC 6488 §2-§4;RFC 9589 §4。
|
||
|
||
本文件描述**通用外壳模型**(eContentType/eContent 由具体对象文档给出)。
|
||
|
||
## 5.2 原始载体与编码
|
||
|
||
- 载体:CMS `ContentInfo`,其中 `contentType` 为 SignedData。RFC 6488 §2;RFC 6488 §3(1a)。
|
||
- 编码:DER。RFC 6488 §2;RFC 6488 §3(1l)。
|
||
|
||
### 5.2.1 CMS 外壳:ContentInfo(ASN.1;RFC 5652 §3)
|
||
|
||
```asn1
|
||
ContentInfo ::= SEQUENCE {
|
||
contentType ContentType,
|
||
content [0] EXPLICIT ANY DEFINED BY contentType }
|
||
|
||
ContentType ::= OBJECT IDENTIFIER
|
||
```
|
||
|
||
### 5.2.2 CMS 外壳:SignedData(ASN.1;RFC 5652 §5.1)
|
||
|
||
```asn1
|
||
id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
|
||
us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }
|
||
|
||
SignedData ::= SEQUENCE {
|
||
version CMSVersion,
|
||
digestAlgorithms DigestAlgorithmIdentifiers,
|
||
encapContentInfo EncapsulatedContentInfo,
|
||
certificates [0] IMPLICIT CertificateSet OPTIONAL,
|
||
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
|
||
signerInfos SignerInfos }
|
||
|
||
DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
|
||
|
||
SignerInfos ::= SET OF SignerInfo
|
||
```
|
||
|
||
### 5.2.3 CMS 外壳:EncapsulatedContentInfo(ASN.1;RFC 5652 §5.2)
|
||
|
||
```asn1
|
||
EncapsulatedContentInfo ::= SEQUENCE {
|
||
eContentType ContentType,
|
||
eContent [0] EXPLICIT OCTET STRING OPTIONAL }
|
||
|
||
ContentType ::= OBJECT IDENTIFIER
|
||
```
|
||
|
||
> 注:CMS 允许 `eContent` 不一定 DER 编码(RFC 5652 §5.2);但 RPKI signed object profile 要求**整个对象 DER 编码**(RFC 6488 §2;RFC 6488 §3(1l)),且 eContent(payload)由对象规范定义并通常为 DER(如 ROA:RFC 9582 §4;Manifest:RFC 9286 §4.2)。
|
||
|
||
### 5.2.4 CMS 外壳:SignerInfo 与 Attribute(ASN.1;RFC 5652 §5.3)
|
||
|
||
```asn1
|
||
SignerInfo ::= SEQUENCE {
|
||
version CMSVersion,
|
||
sid SignerIdentifier,
|
||
digestAlgorithm DigestAlgorithmIdentifier,
|
||
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
|
||
signatureAlgorithm SignatureAlgorithmIdentifier,
|
||
signature SignatureValue,
|
||
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
|
||
|
||
SignerIdentifier ::= CHOICE {
|
||
issuerAndSerialNumber IssuerAndSerialNumber,
|
||
subjectKeyIdentifier [0] SubjectKeyIdentifier }
|
||
|
||
SignedAttributes ::= SET SIZE (1..MAX) OF Attribute
|
||
|
||
UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute
|
||
|
||
Attribute ::= SEQUENCE {
|
||
attrType OBJECT IDENTIFIER,
|
||
attrValues SET OF AttributeValue }
|
||
|
||
AttributeValue ::= ANY
|
||
|
||
SignatureValue ::= OCTET STRING
|
||
```
|
||
|
||
### 5.2.5 RPKI 对 CMS 外壳字段的 profile 约束(RFC 6488 §2.1;RFC 6488 §3;更新:RFC 9589 §4)
|
||
|
||
> 说明:上面是 CMS 的通用 ASN.1;RPKI 进一步约束取值与允许出现的字段(例如 SignedData.version 必须为 3、crls 必须省略、signedAttrs 的内容限制等)。RFC 6488 §2-§3;RFC 9589 §4。
|
||
|
||
### 5.2.6 signedAttrs 中允许的属性与 attrType OID(RFC 6488 §2.1.6.4.1-§2.1.6.4.2;更新:RFC 9589 §4)
|
||
|
||
RPKI signed object profile 对 `SignerInfo.signedAttrs` 的 Attribute 集合施加限制(除 ASN.1 结构外,还包含“只允许哪些 attrType”的编码约束):
|
||
|
||
- `content-type`:attrType OID `1.2.840.113549.1.9.3`。RFC 6488 §2.1.6.4.1。
|
||
- `message-digest`:attrType OID `1.2.840.113549.1.9.4`。RFC 6488 §2.1.6.4.2。
|
||
- `signing-time`:attrType OID `1.2.840.113549.1.9.5`。RFC 9589 §4(更新 RFC 6488 的相关要求)。
|
||
|
||
并且:
|
||
|
||
- 每种属性在集合中只能出现一次;且 `attrValues` 虽然语法是 `SET OF`,但在 RPKI 中必须只含一个值。RFC 6488 §2.1.6.4。
|
||
|
||
## 5.3 抽象数据模型(接口)
|
||
|
||
### 5.3.1 `RpkiSignedObject`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `raw_der` | `DerBytes` | CMS DER | 原样保留(建议) | RFC 6488 §2;RFC 6488 §3(1l) |
|
||
| `content_info_content_type` | `Oid` | ContentInfo.contentType | MUST 为 SignedData:`1.2.840.113549.1.7.2` | RFC 6488 §3(1a) |
|
||
| `signed_data` | `SignedDataProfiled` | SignedData 语义字段 | 见下 | RFC 6488 §2.1;RFC 6488 §3 |
|
||
|
||
### 5.3.2 `SignedDataProfiled`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `version` | `int` | SignedData.version | MUST 为 3 | RFC 6488 §3(1b);RFC 6488 §2.1.1 |
|
||
| `digest_algorithms` | `list[Oid]` | SignedData.digestAlgorithms | MUST contain exactly one digest algorithm,且必须为 `id-sha256`(`2.16.840.1.101.3.4.2.1`) | RFC 6488 §2.1.2;RFC 7935 §2(引用 RFC 5754) |
|
||
| `encap_content_info` | `EncapsulatedContentInfo` | EncapsulatedContentInfo | 见下;eContentType 由具体对象定义 | RFC 6488 §2.1.3 |
|
||
| `certificates` | `list[ResourceEeCertificate]` | SignedData.certificates | MUST present;且仅包含 1 个 EE 证书;该 EE 的 SKI 必须匹配 SignerInfo.sid | RFC 6488 §3(1c) |
|
||
| `crls` | `None` | SignedData.crls | MUST be omitted | RFC 6488 §3(1d) |
|
||
| `signer_infos` | `list[SignerInfoProfiled]` | SignedData.signerInfos | MUST contain exactly one SignerInfo | RFC 6488 §2.1;RFC 6488 §2.1(SignerInfos 约束段落) |
|
||
|
||
### 5.3.3 `EncapsulatedContentInfo`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `econtent_type` | `Oid` | eContentType | MUST 与 signedAttrs.content-type 的 attrValues 一致;具体值由对象定义(如 ROA/MFT) | RFC 6488 §3(1h);RFC 6488 §2.1.3.1 |
|
||
| `econtent_der` | `DerBytes` | eContent(对象 payload) | DER 编码的对象特定 ASN.1(ROA/MFT 文档定义);在 CMS 中以 OCTET STRING 承载 | RFC 6488 §2.1.3;RFC 9286 §4.2;RFC 9582 §4 |
|
||
|
||
### 5.3.4 `SignerInfoProfiled`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `version` | `int` | SignerInfo.version | MUST 为 3 | RFC 6488 §3(1e) |
|
||
| `sid_ski` | `bytes` | sid(SubjectKeyIdentifier) | 必须与 EE 证书的 SKI 匹配 | RFC 6488 §3(1c) |
|
||
| `digest_algorithm` | `Oid` | SignerInfo.digestAlgorithm | 必须为 `id-sha256`(`2.16.840.1.101.3.4.2.1`) | RFC 6488 §3(1j);RFC 7935 §2(引用 RFC 5754) |
|
||
| `signature_algorithm` | `Oid` | SignerInfo.signatureAlgorithm | 生成时 MUST 为 `rsaEncryption`(`1.2.840.113549.1.1.1`);验证时实现必须接受 `rsaEncryption` 或 `sha256WithRSAEncryption`(`1.2.840.113549.1.1.11`) | RFC 6488 §3(1k);RFC 7935 §2 |
|
||
| `signed_attrs` | `SignedAttrsProfiled` | signedAttrs | MUST present;仅允许特定 3 个属性 | RFC 9589 §4(更新 RFC 6488 §3(1f)/(1g)) |
|
||
| `unsigned_attrs` | `None` | unsignedAttrs | MUST be omitted | RFC 6488 §3(1i) |
|
||
|
||
### 5.3.5 `SignedAttrsProfiled`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `content_type` | `Oid` | signedAttrs.content-type | attrType=`1.2.840.113549.1.9.3`;MUST present;attrValues 等于 eContentType | RFC 9589 §4;RFC 6488 §3(1h) |
|
||
| `message_digest` | `bytes` | signedAttrs.message-digest | attrType=`1.2.840.113549.1.9.4`;MUST present | RFC 9589 §4(更新 RFC 6488 §3(1f)) |
|
||
| `signing_time` | `UtcTime` | signedAttrs.signing-time | attrType=`1.2.840.113549.1.9.5`;MUST present(时间值正确性不用于安全假设) | RFC 9589 §4;RFC 9589 §5 |
|
||
| `other_attrs` | `None` | 其它 signed attributes | MUST NOT be included(binary-signing-time 也不允许) | RFC 9589 §4 |
|
||
|
||
## 5.4 字段级约束清单(实现对照)
|
||
|
||
- ContentInfo.contentType 必须为 SignedData(OID `1.2.840.113549.1.7.2`)。RFC 6488 §3(1a)。
|
||
- SignedData.version 必须为 3,且 SignerInfos 仅允许 1 个 SignerInfo。RFC 6488 §3(1b);RFC 6488 §2.1。
|
||
- SignedData.certificates 必须存在且仅含 1 个 EE 证书;该证书 SKI 必须匹配 SignerInfo.sid。RFC 6488 §3(1c)。
|
||
- SignedData.crls 必须省略。RFC 6488 §3(1d)。
|
||
- signedAttrs 必须存在,且仅允许 content-type/message-digest/signing-time;其它全部禁止。RFC 9589 §4。
|
||
- eContentType 必须与 content-type attribute 一致。RFC 6488 §3(1h)。
|
||
- unsignedAttrs 必须省略。RFC 6488 §3(1i)。
|
||
- digest/signature 算法必须符合算法 profile。RFC 6488 §3(1j)/(1k);RFC 7935 §2。
|
||
- 整个对象必须 DER 编码。RFC 6488 §3(1l)。
|