2. BRSKI核心概念

好,咱们正式开始啃 BRSKI 的硬骨头。这一章我会把六个核心概念掰开揉碎讲清楚。你想想看,一个设备要安全入网,总得有人介绍、有人担保、有人发证吧?这六个角色就是干这些活的。

我个人习惯把这六个实体分成三组来记:入网方(Pledge、Join Proxy)、管理方(Join Registrar、Domain CA)、担保方(MASA、Voucher)。这样逻辑就顺了。

一句话总结:Pledge 想入网 → 通过 Join Proxy 找到 Join Registrar → Registrar 找 MASA 要 Voucher → Voucher 证明 Pledge 身份 → Domain CA 给它发证书。搞定。

2.1 Pledge —— 那个想入网的新设备

Pledge 就是刚出厂、还没被任何网络管理过的设备。说白了,它就是个「网络黑户」。我刚开始接触 BRSKI 时,总觉得 Pledge 就是个普通的客户端,后来才发现它身上有两个关键东西:IEEE 802.1AR 证书(也叫 IDevID)和制造商植入的私钥。

嗯,这里要注意:Pledge 在入网前只知道两件事——自己的身份(IDevID)和怎么找到 Join Proxy。别的它一概不知。

  • 身份凭证:出厂时烧录的 IDevID 证书,不可篡改
  • 初始状态:没有网络配置,没有域证书
  • 行为模式:主动发起 DTLS 连接,请求入网

我的经验:曾经有个项目,Pledge 的 IDevID 证书过期了,结果整个入网流程卡在证书校验阶段。后来我养成了习惯——拿到设备先检查证书有效期,别等部署了才发现。

2.2 Join Proxy —— 那个传话的中间人

Join Proxy 是个很有意思的角色。它自己不参与决策,就是个「传话筒」。但你别小看它,没有它,Pledge 和 Registrar 可能根本说不上话。

为什么会这样?因为 Pledge 刚上电,连 IP 地址可能都是 DHCP 临时给的,它根本不知道 Registrar 在哪。Join Proxy 的作用就是:在本地网络里广播自己的存在,然后帮 Pledge 把请求转发给 Registrar。

我记得有一次在客户现场调试,Join Proxy 和 Registrar 之间的网络不通,Pledge 的请求全丢了。查了半天才发现是防火墙把 443 端口拦了。从那以后,我每次部署都会先确认 Proxy→Registrar 的连通性。

角色 职责 关键行为
Join Proxy 转发 Pledge 的请求 监听本地网络,中继 DTLS 连接
Pledge 发起入网请求 携带 IDevID,请求 Voucher

2.3 Join Registrar —— 那个管事的

Join Registrar 是网络管理方的代表。它负责验证 Pledge 的身份,决定要不要让它入网。你可以把它理解成「网络管理员」的自动化版本。

Registrar 手里有两张牌:一是它自己的证书(由 Domain CA 签发),二是它知道怎么联系 MASA。当 Pledge 通过 Proxy 找过来时,Registrar 会做三件事:

  1. 验证 Pledge 的 IDevID——检查证书链是否可信
  2. 向 MASA 请求 Voucher——确认 Pledge 没有被篡改
  3. 签发本地证书——如果一切正常,让 Domain CA 给 Pledge 发证

避坑指南:我曾经遇到过 Registrar 和 MASA 之间的时钟不同步,导致 Voucher 签名验证失败。BRSKI 对时间同步要求很严格,NTP 一定要配好,否则你会被各种证书过期错误折磨到崩溃。

2.4 MASA —— 那个制造商后台

MASA(Manufacturer Authorized Signing Authority)是制造商运营的云服务。它手里有所有出厂设备的记录。当 Registrar 来问「这个 Pledge 是不是你们家生产的?」时,MASA 就查数据库,然后签发一个 Voucher 作为担保。

说白了,MASA 就是设备的「出生证明」开具有。它不关心你网络怎么配,只负责证明设备身份的真实性。

  • 核心数据:设备序列号、IDevID 公钥、生产批次
  • 对外接口:HTTPS API,接收 Voucher Request,返回 Voucher
  • 安全要求:必须用私钥签名 Voucher,防止伪造

2.5 Voucher —— 那个担保书

Voucher 是整个 BRSKI 流程里最关键的数据结构。它是一个签名的 JSON 对象,内容大致是:「我,MASA,证明设备 X 属于网络 Y,请 Registrar 给它发证书。」

嗯,这里要注意:Voucher 是有时效性的。我见过有人把 Voucher 当成永久凭证来用,结果设备重新入网时发现 Voucher 过期了。正确的做法是:每次入网都重新请求 Voucher。

// Voucher 的简化结构(RFC 8366)
{
  "ietf-voucher:voucher": {
    "created-on": "2024-01-15T08:00:00Z",
    "expires-on": "2024-01-16T08:00:00Z",
    "serial-number": "SN-12345678",
    "assertion": "verified",
    "pinned-domain-cert": "base64...",
    "signature": "base64..."
  }
}

我的习惯:调试时我会先用 openssl cms -verify 手动验证 Voucher 签名,确认 MASA 的证书链没问题,再集成到自动化流程里。这一步能省掉很多排查时间。

2.6 Domain CA —— 那个发证机关

Domain CA 是网络内部的证书颁发机构。它负责给所有通过验证的设备签发本地证书(LDevID)。有了这个证书,设备才能在网络里正常通信。

你想想看,Pledge 的 IDevID 是制造商给的,只能证明「你是谁家的设备」。而 Domain CA 签发的 LDevID 证明的是「你属于这个网络」。这是两个完全不同的信任域。

证书类型 签发者 用途 有效期
IDevID 制造商 证明设备身份 设备生命周期
LDevID Domain CA 证明网络归属 按策略配置(通常 1-5 年)

2.7 它们怎么配合?一张图看懂

下面这张图展示了六个实体之间的核心交互流程。我建议你多看几遍,把每个箭头对应的协议交互记清楚。

BRSKI 核心实体交互流程 Pledge Join Proxy Join Registrar MASA Domain CA Voucher ① DTLS 连接 ② 转发请求 ③ Voucher Request ④ 签发 ⑤ 返回 Voucher ⑥ 请求签发 LDevID ⑦ 返回证书 ⑧ 入网成功 说明: ①-②:Pledge 通过 Proxy 找到 Registrar,建立 DTLS 安全通道。 ③-⑤:Registrar 向 MASA 请求 Voucher,验证 Pledge 身份。 ⑥-⑧:Domain CA 签发 LDevID,Registrar 通知 Pledge 入网成功。

2.8 避坑总结

最后,我把自己踩过的坑整理一下,你记好了:

  • 证书有效期:IDevID 虽然说是设备生命周期,但实际有 10-20 年限制。部署前检查一下,别等过期了才慌。
  • 时钟同步:BRSKI 所有签名验证都依赖时间。NTP 必须配,而且建议用多个源。
  • Voucher 缓存:不要缓存 Voucher 重复使用。每次入网都重新请求,MASA 那边会有防重放机制。
  • Proxy 发现:Join Proxy 通常用 mDNS 或 DHCP 选项广播。如果设备找不到 Proxy,先查这两项配置。

血的教训:我曾经在生产环境里忘了配 Domain CA 的 CRL 分发点,结果设备证书吊销后,新设备还能用旧证书入网。从那以后,我每次部署都会用 openssl x509 -text -in cert.pem | grep CRL 检查一遍。

好了,这六个核心概念你搞清楚了,后面学协议细节就会轻松很多。记住这张交互图,它就是 BRSKI 的骨架。