RPKI 资源公钥基础设施:BGP 路由安全的密码学基石
引言:BGP 的信任危机
BGP(边界网关协议)是互联网骨干网络的"路由器语言",负责在不同自治系统(AS)之间交换路由信息。然而,BGP 在设计时假设所有参与者都是诚实的,导致了一个致命缺陷:任何人都可以声明自己拥有任意 IP 地址段。
现实中的攻击案例触目惊心:
- 2008 年巴基斯坦电信劫持 YouTube 流量,导致全球用户无法访问
- 2012 年伊朗 BT 宣布拥有 Google 的所有 IP 前缀,Google 流量被截获两周
- 2018 年委内瑞拉 BGP 泄漏事件,攻击者篡改 DNS 记录并拦截用户流量
RPKI 的核心设计思想
RPKI 借鉴了传统 PKI 的思路,但有一个关键差异:证书不绑定身份,而是绑定资源。
在传统 PKI 中,X.509 证书证明"这个人/这个服务器拥有这个域名"。而在 RPKI 中,资源证书证明"这个组织持有这批 IP 地址或 AS 编号"。
三层信任模型
┌─────────────────────────────────────────────┐
│ IANA(全球互联网号码分配) │
│ Trust Anchor #1 │
└──────────────────┬──────────────────────────┘
│ 授权
┌──────────────────▼──────────────────────────┐
│ 5 个 RIR(区域互联网注册机构) │
│ ARIN / RIPE NCC / APNIC / LACNIC / AFRINIC │
│ Trust Anchor #2-6 │
└──────────────────┬──────────────────────────┘
│ 分配
┌──────────────────▼──────────────────────────┐
│ LIR / ISP / 企业 │
│ 获得资源证书,签发 ROA │
└─────────────────────────────────────────────┘RPKI 的信任锚点就是 5 个 RIR 的根证书。与 TLS 的数百个根证书不同,RPKI 只有 5 个信任锚点,这是有意为之的设计简化。
RFC 6480-6488 标准体系
RPKI 不是一个单一协议,而是一组相互关联的 RFC:
| RFC | 名称 | 作用 |
|---|---|---|
| RFC 6480 | RPKI 架构 | 定义整体架构、组件关系 |
| RFC 6481 | 仓库结构 | 定义证书仓库的文件结构和同步机制 |
| RFC 6482 | ROA 格式 | 定义路由源授权的结构和语义 |
| RFC 6483 | 路由验证 | 定义 BGP 路由来源验证的逻辑 |
| RFC 6484 | 证书策略 | 定义 RPKI PKI 的证书政策 |
| RFC 6485 | GRXP 协议 | 定义注册机构与 RIR 之间的协议 |
| RFC 6486 | Manifest | 定义仓库完整性验证机制 |
| RFC 6487 | 资源证书 | 定义 X.509 资源证书的扩展格式 |
| RFC 6488 | 签名对象 | 定义 CMS 包装的签名对象格式 |
| RFC 6489 | 密钥轮换 | 定义 CA 密钥轮换程序 |
| RFC 6490 | 信任锚 | 定义信任锚发布机制 |
| RFC 6491-6493 | GRXP 扩展 | 补充 GRXP 协议的细节 |
资源证书:IP 资源的身份凭证
证书结构
RPKI 使用修改版的 X.509 证书,核心扩展在 RFC 3779(IP 地址和 AS 标识符扩展)中定义。
资源证书包含两个关键扩展:
- IP Address Delegation 扩展:声明该实体持有的 IP 地址范围
- AS Identifier 扩展:声明该实体管理的 AS 编号
IPAddressFamily ::= SEQUENCE {
addressFamily (IPv4 | IPv6),
ipAddrBlocks SEQUENCE OF IPAddressAssignments
}
IPAddressAssignments ::= SEQUENCE {
address IPAddressOrPrefix,
length INTEGER
}示例:一个典型的资源证书
假设 ABC ISP 从 RIPE NCC 获得了 192.0.2.0/24 和 AS65001:
Subject: CN=ABC ISP
IP Address Delegation:
IPv4: 192.0.2.0/24 (max prefix length: /24)
AS Identifier: AS65001
Validity: 2024-01-01 ~ 2026-12-31
Signature: RIPE NCC's CA key这个证书本身不授予路由权,只是证明"ABC ISP 持有这个地址段"。要实际授权路由,还需要签发 ROA。
ROA:路由授权的核心对象
ROA 的 ASN.1 结构
ROA(Route Origin Authorization,路由源授权)是 RPKI 的核心签名对象,定义在 RFC 6482 中。
RouteOriginAttestation ::= SEQUENCE {
version [0] INTEGER DEFAULT 0,
asID ASID,
ipAddrBlocks SEQUENCE SIZE (1..MAX) OF ROAIPAddressFamily
}
ASID ::= INTEGER
ROAIPAddressFamily ::= SEQUENCE {
addressFamily OCTET STRING (SIZE (2..3)),
addresses SEQUENCE SIZE (1..MAX) OF ROAIPAddress
}
ROAIPAddress ::= SEQUENCE {
address IPAddress,
maxLength INTEGER OPTIONAL
}ROA 字段解读
| 字段 | 含义 | 示例值 |
|---|---|---|
asID | 被授权的 AS 编号 | 65001 |
address | 允许宣告的 IP 前缀 | 192.0.2.0/24 |
maxLength | 最长前缀掩码(可选) | 26 |
maxLength 语义
maxLength 是关键参数,它允许父级授权子级宣告更具体的路由:
父级 ROA: AS65001, 192.0.2.0/24, maxLength=26
允许宣告:
- 192.0.2.0/24 (精确匹配)
- 192.0.2.0/25 (更具体)
- 192.0.2.128/25 (更具体)
不允许宣告:
- 192.0.2.0/26 (超过 maxLength)
- 192.0.3.0/24 (不在授权范围内)如果没有 maxLength,则只允许宣告精确匹配的前缀。
ROA 的签名格式
ROA 使用 CMS(Cryptographic Message Syntax)包装,定义在 RFC 6488 中。内容类型 OID 为:
id-ct-routeOriginAuthz OBJECT IDENTIFIER ::= { 1 2 840 113549 1 9 16 1 24 }实际 ROA 文件包含:
- CMS 签名数据结构
- 内嵌的 ROA 内容(ASN.1 DER 编码)
- 签发者的 EE 证书
- 上级 CA 的证书链
仓库系统:分布式对象存储
仓库层级结构
RPKI 仓库是一个分层的分布式文件系统,每个 CA 节点有一个仓库发布点:
https://rpki.ripe.net/
├── manifests/
│ └── a1b2c3d4e5.mft # CA 的清单文件
├── certificates/
│ ├── xyz789.cer # 子级 CA 证书
│ └── def456.cer # EE 证书
├── crls/
│ └── a1b2c3d4e5.crl # CRL
└── roas/
├── route-123.roa # ROA 文件
└── route-456.roa # ROA 文件对象命名规范
| 扩展名 | 对象类型 | RFC 引用 |
|---|---|---|
.cer | 证书 | RFC 6487 |
.crl | 吊销列表 | RFC 5280 |
.mft | 清单文件 | RFC 6486 |
.roa | 路由授权 | RFC 6482 |
Manifest:仓库完整性保障
Manifest 是 CA 仓库的"目录清单",包含所有发布对象的哈希值:
ManifestData ::= SEQUENCE {
certificateURL IA5String,
thisUpdate Time,
nextUpdate Time,
repoFileHashes SEQUENCE OF RepoFileHash
}
RepoFileHash ::= SEQUENCE {
fileName IA5String,
hashValue BIT STRING
}每个 CA 必须在其仓库中维护一个有效的 Manifest。RPKI 消费者通过验证 Manifest 的完整性来确保仓库内容未被篡改。
路由验证:RTR 协议
验证流程
当 BGP 路由器收到路由更新时,验证流程如下:
BGP UPDATE 消息
│
▼
┌─────────────────┐
│ 提取前缀和 AS │
└────────┬────────┘
│
▼
┌─────────────────┐ ┌──────────────┐
│ 查找 ROA │────▶│ 验证通过? │
│ (RFC 6482) │ └──────┬───────┘
└─────────────────┘ │
│ │
▼ ▼
Valid (VRF) Invalid (IR)
路由接受 路由拒绝RTR 协议:缓存器与路由器的通信
路由器不直接访问 RPKI 仓库,而是通过 RTR(Router-to-Router)协议从缓存器获取验证结果。RTR 定义在 RFC 6483 中:
RPKI 消费者 ──RTR──▶ 缓存器 ──rsync──▶ RPKI 仓库
│ │
▼ ▼
BGP 路由器 定期同步RTR 协议的消息格式:
Message Type Length Payload
─────────────────────────────────
INIT 4 bytes Serial Number
SOA 4 bytes Serial, Refresh, Retry, Expire, Minimum
RESPONSE variable ROA objects or NULL
END_OF_RECORD 0 bytes
NOTIFY 4 bytes Error Code验证状态
BGP 路由有三种验证状态:
| 状态 | 含义 | 处理 |
|---|---|---|
| Valid | 存在匹配的 ROA | 接受路由 |
| Invalid | 存在 ROA 但 AS 或前缀不匹配 | 拒绝路由 |
| Not Found | 没有匹配的 ROA | 默认处理(依策略) |
国密视角:RPKI 与中国的部署现状
中国的 RPKI 实践
中国作为互联网大国,积极参与 RPKI 部署:
- CNNIC(中国互联网络信息中心) 担任 APNIC 下属的注册机构,为国内 ISP 签发资源证书
- CHINANET、CN2 等骨干网已部署 RPKI 验证功能
- 2023 年,工信部推动"国家互联网路由资源管理系统"建设,部分借鉴 RPKI 理念
国密适配挑战
RPKI 当前基于 RSA 和 ECDSA,而国密标准使用 SM2。如果要构建国密版 RPKI,需要考虑:
- 证书扩展:RFC 3779 的 IP Address Delegation 扩展需要适配 SM2 证书格式
- 签名算法:CMS 包装需要支持 SM2 签名(参考 GM/T 0034-2014)
- 仓库协议:rsync 协议本身无关算法,但对象格式需要调整
部署现状与挑战
全球部署数据
截至 2024 年:
- 全球 ROA 数量:约 300 万+
- 部署 RPKI 验证的运营商:超过 500 家
- 中国 ROA 数量:约 50 万+(CNNIC 统计数据)
主要挑战
- 部署门槛:需要理解 BGP、PKI、ASN.1 等多个技术领域
- 父子协调:父级 RIR 必须先部署,子级 ISP 才能使用
- 错误配置:错误的 maxLength 设置会导致路由被标记为 Invalid
- 安全性局限:RPKI 只能验证路由来源,不能防止路径污染(BGP Path Validation 仍在研究中)
结语
RPKI 是互联网基础设施安全的重要里程碑。它用密码学的严格性填补了 BGP 的信任空白,将"谁可以宣告这个前缀"从一个道德问题变成了一个数学问题。
对于网络安全从业者而言,理解 RPKI 不仅是掌握一项技术,更是理解互联网治理的基础设施逻辑。随着 BGP 劫持事件的频发,RPKI 的部署只会越来越广泛。
参考资料
- RFC 6480 - An Infrastructure to Support Secure Internet Routing
- RFC 6482 - A Profile for Route Origin Authorizations (ROAs)
- RFC 6483 - The RPKI to Router Protocol
- RFC 6487 - A Profile for X.509 PKIX Resource Certificates
- IETF SIDR 工作组
- APNIC RPKI 工具页面
- RFC 3779 - X.509 Extensions for IP Addresses and AS Identifiers