rpki/specs/07_roa.md

7.1 KiB
Raw Blame History

07. ROARoute Origin Authorization

7.1 对象定位

ROA 是一种 RPKI Signed Object用于声明“某 AS 被授权起源某些前缀”。RFC 9582 §1RFC 9582 §4。

ROA 由 CMS 外壳 + ROA eContent 组成:

  • 外壳RFC 6488更新RFC 9589
  • eContentRFC 9582

7.2 原始载体与编码

  • 外壳CMS SignedData DER05_signed_object_cms.md。RFC 9582 §1引用 RFC 6488
  • eContentTypeid-ct-routeOriginAuthzOID 1.2.840.113549.1.9.16.1.24。RFC 9582 §3。
  • eContentDER 编码 ASN.1 RouteOriginAttestation。RFC 9582 §4。

7.2.1 eContentType 与 eContent 的 ASN.1 定义RFC 9582 §3RFC 9582 §4

ROA 是一种 RPKI signed objectCMS 外壳见 05_signed_object_cms.md。RFC 9582 定义了其 eContentType 以及 eContentpayload的 ASN.1。RFC 9582 §3-§4。

eContentTypeOIDRFC 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) }

eContentROA 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

  1. 解析 CMS 外壳,得到 econtent_typeecontent_der。RFC 6488 §3RFC 9589 §4。
  2. 要求 econtent_type == 1.2.840.113549.1.9.16.1.24。RFC 9582 §3。
  3. econtent_der 以 DER 解析为 RouteOriginAttestation ASN.1。RFC 9582 §4。
  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 §1RFC 6488 §3RFC 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 RoaEContentRouteOriginAttestation

字段 类型 语义 约束/解析规则 RFC 引用
version int version MUST 为 0 RFC 9582 §4.1
as_id int asID 0..4294967295 RFC 9582 §4ASID 定义RFC 9582 §4.2
ip_addr_blocks list[RoaIpAddressFamily] ipAddrBlocks SIZE(1..2);最多 IPv4/IPv6 各一个;建议 canonicalize RFC 9582 §4RFC 9582 §4.3.1RFC 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 §4ROAAddressesIPv4/IPv6RFC 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_lenSHOULD NOT 编码(未来 RP 可能视为编码错误) RFC 9582 §4.3.2.2

7.5 字段级约束清单(实现对照)

  • eContentType 必须为 id-ct-routeOriginAuthzOID 1.2.840.113549.1.9.16.1.24),且该 OID 必须同时出现在 eContentType 与 signedAttrs.content-type。RFC 9582 §3引用 RFC 6488
  • eContent 必须 DER 编码并符合 RouteOriginAttestation ASN.1。RFC 9582 §4。
  • version 必须为 0。RFC 9582 §4.1。
  • ipAddrBlocks 长度为 1..2;每种 AFI 最多出现一次;仅支持 IPv4/IPv6。RFC 9582 §4RFC 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 6488RFC 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 §5RFC 3779 §2.3。