7.1 KiB
7.1 KiB
07. ROA(Route Origin Authorization)
7.1 对象定位
ROA 是一种 RPKI Signed Object,用于声明“某 AS 被授权起源某些前缀”。RFC 9582 §1;RFC 9582 §4。
ROA 由 CMS 外壳 + ROA eContent 组成:
- 外壳:RFC 6488(更新:RFC 9589)
- eContent:RFC 9582
7.2 原始载体与编码
- 外壳:CMS SignedData DER(见
05_signed_object_cms.md)。RFC 9582 §1(引用 RFC 6488)。 - eContentType:
id-ct-routeOriginAuthz,OID1.2.840.113549.1.9.16.1.24。RFC 9582 §3。 - eContent:DER 编码 ASN.1
RouteOriginAttestation。RFC 9582 §4。
7.2.1 eContentType 与 eContent 的 ASN.1 定义(RFC 9582 §3;RFC 9582 §4)
ROA 是一种 RPKI signed object(CMS 外壳见 05_signed_object_cms.md)。RFC 9582 定义了其 eContentType 以及 eContent(payload)的 ASN.1。RFC 9582 §3-§4。
eContentType(OID):RFC 9582 §3。
id-ct-routeOriginAuthz OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs-9(9) id-smime(16) id-ct(1) routeOriginAuthz(24) }
eContent(ROA ASN.1 模块):RFC 9582 §4。
RPKI-ROA-2023
{ iso(1) member-body(2) us(840) rsadsi(113549)
pkcs(1) pkcs9(9) smime(16) mod(0)
id-mod-rpkiROA-2023(75) }
DEFINITIONS EXPLICIT TAGS ::=
BEGIN
IMPORTS
CONTENT-TYPE
FROM CryptographicMessageSyntax-2010 -- in [RFC6268]
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) } ;
ct-routeOriginAttestation CONTENT-TYPE ::=
{ TYPE RouteOriginAttestation
IDENTIFIED BY id-ct-routeOriginAuthz }
id-ct-routeOriginAuthz OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs-9(9) id-smime(16) id-ct(1) routeOriginAuthz(24) }
RouteOriginAttestation ::= SEQUENCE {
version [0] INTEGER DEFAULT 0,
asID ASID,
ipAddrBlocks SEQUENCE (SIZE(1..2)) OF ROAIPAddressFamily }
ASID ::= INTEGER (0..4294967295)
ROAIPAddressFamily ::= SEQUENCE {
addressFamily ADDRESS-FAMILY.&afi ({AddressFamilySet}),
addresses ADDRESS-FAMILY.&Addresses
({AddressFamilySet}{@addressFamily}) }
ADDRESS-FAMILY ::= CLASS {
&afi OCTET STRING (SIZE(2)) UNIQUE,
&Addresses
} WITH SYNTAX { AFI &afi ADDRESSES &Addresses }
AddressFamilySet ADDRESS-FAMILY ::=
{ addressFamilyIPv4 | addressFamilyIPv6 }
addressFamilyIPv4 ADDRESS-FAMILY ::=
{ AFI afi-IPv4 ADDRESSES ROAAddressesIPv4 }
addressFamilyIPv6 ADDRESS-FAMILY ::=
{ AFI afi-IPv6 ADDRESSES ROAAddressesIPv6 }
afi-IPv4 OCTET STRING ::= '0001'H
afi-IPv6 OCTET STRING ::= '0002'H
ROAAddressesIPv4 ::= SEQUENCE (SIZE(1..MAX)) OF ROAIPAddress{ub-IPv4}
ROAAddressesIPv6 ::= SEQUENCE (SIZE(1..MAX)) OF ROAIPAddress{ub-IPv6}
ub-IPv4 INTEGER ::= 32
ub-IPv6 INTEGER ::= 128
ROAIPAddress {INTEGER: ub} ::= SEQUENCE {
address BIT STRING (SIZE(0..ub)),
maxLength INTEGER (0..ub) OPTIONAL }
END
编码/解码要点(与上面 ASN.1 结构直接对应):
addressFamily仅允许 IPv4/IPv6 两种 AFI,并且每个 AFI 最多出现一次。RFC 9582 §4.3.1。address是 BIT STRING 表示的前缀,语义与 RFC 3779 的IPAddress一致(按前缀长度截断,DER unused bits 置零)。RFC 9582 §4.3.2.1(引用 RFC 3779 §2.2.3.8)。maxLength为可选字段,出现与否会影响语义与编码规范约束(例如等于前缀长时不建议编码)。RFC 9582 §4.3.2.2。
7.3 解析规则(eContent 语义层)
输入:RpkiSignedObject。
- 解析 CMS 外壳,得到
econtent_type与econtent_der。RFC 6488 §3;RFC 9589 §4。 - 要求
econtent_type == 1.2.840.113549.1.9.16.1.24。RFC 9582 §3。 - 将
econtent_der以 DER 解析为RouteOriginAttestationASN.1。RFC 9582 §4。 - 将
ipAddrBlocks解析为“前缀集合”的语义结构,并建议按 RFC 9582 给出的 canonicalization 过程做去重/排序/归一化(以便后续处理一致)。RFC 9582 §4.3.3。
7.4 抽象数据模型(接口)
7.4.1 RoaObject
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|---|---|---|---|---|
signed_object |
RpkiSignedObject |
CMS 外壳 | 外壳约束见 RFC 6488/9589 | RFC 9582 §1;RFC 6488 §3;RFC 9589 §4 |
econtent_type |
Oid |
eContentType | 必须为 1.2.840.113549.1.9.16.1.24 |
RFC 9582 §3 |
roa |
RoaEContent |
eContent 语义对象 | 见下 | RFC 9582 §4 |
7.4.2 RoaEContent(RouteOriginAttestation)
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|---|---|---|---|---|
version |
int |
version | MUST 为 0 | RFC 9582 §4.1 |
as_id |
int |
asID | 0..4294967295 | RFC 9582 §4(ASID 定义);RFC 9582 §4.2 |
ip_addr_blocks |
list[RoaIpAddressFamily] |
ipAddrBlocks | SIZE(1..2);最多 IPv4/IPv6 各一个;建议 canonicalize |
RFC 9582 §4;RFC 9582 §4.3.1;RFC 9582 §4.3.3 |
7.4.3 RoaIpAddressFamily
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|---|---|---|---|---|
afi |
enum { ipv4, ipv6 } |
Address Family | MUST 为 IPv4(0001) 或 IPv6(0002) | RFC 9582 §4.3.1 |
addresses |
list[RoaIpAddress] |
前缀列表 | SIZE(1..MAX);每项为前缀 + 可选 maxLength |
RFC 9582 §4(ROAAddressesIPv4/IPv6);RFC 9582 §4.3.2 |
7.4.4 RoaIpAddress
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|---|---|---|---|---|
prefix |
IpPrefix |
前缀 | address 以 BIT STRING 表示前缀(同 RFC 3779 IPAddress 表示) | RFC 9582 §4.3.2.1(引用 RFC 3779 §2.2.3.8) |
max_length |
optional[int] |
最大允许前缀长 | 若存在:必须 >= prefix_len 且 <= 32/128;并且 maxLength == prefix_len 时 SHOULD NOT 编码(未来 RP 可能视为编码错误) |
RFC 9582 §4.3.2.2 |
7.5 字段级约束清单(实现对照)
- eContentType 必须为
id-ct-routeOriginAuthz(OID1.2.840.113549.1.9.16.1.24),且该 OID 必须同时出现在 eContentType 与 signedAttrs.content-type。RFC 9582 §3(引用 RFC 6488)。 - eContent 必须 DER 编码并符合
RouteOriginAttestationASN.1。RFC 9582 §4。 version必须为 0。RFC 9582 §4.1。ipAddrBlocks长度为 1..2;每种 AFI 最多出现一次;仅支持 IPv4/IPv6。RFC 9582 §4;RFC 9582 §4.3.1。maxLength若存在必须在范围内,且不应出现“等于前缀长”的冗余编码。RFC 9582 §4.3.2.2。- 建议按 canonical form 归一化/排序以利一致处理。RFC 9582 §4.3.3。
7.6 与 EE 证书的语义约束(为后续验证准备)
ROA 的外壳包含一个 EE 证书,用于验证 ROA 签名;RFC 对该 EE 证书与 ROA payload 的匹配关系提出要求:
- ROA 的 EE 证书必须是有效的 RPKI EE 证书(路径从 TA 到 EE 可建立),并用于验证 CMS 签名。RFC 9582 §1(引用 RFC 6488);RFC 6488 §3(2)-(3)。
- ROA EE 证书中的 IP 资源扩展必须存在且不得使用 inherit。RFC 9582 §5。
- ROA EE 证书中 AS 资源扩展不得出现。RFC 9582 §5。
- ROA payload 中每个前缀必须包含在 EE 证书的 IP 资源集合内(资源包含语义来自 RFC 3779)。RFC 9582 §5;RFC 3779 §2.3。