4. BRSKI协议流程

好,我们进入第四章。这一章是整个 BRSKI 协议的核心骨架。说白了,就是一台全新的设备从拆箱到被网络信任,到底经历了什么。

我个人习惯把 BRSKI 的流程拆成三个维度来看:宏观流程(整体长什么样)、微观交互(六步握手具体怎么谈)、内部状态(设备自己怎么记进度)。再加上一个兜底的超时重试,这四个部分吃透了,BRSKI 的运行时你就掌握了。

4.1 整体流程概览:一次安全的“自我介绍”

想象一下,你买了一台新的交换机,插上网线,它连 IP 都没有。它要怎么让网络知道“我是谁,我来自哪个厂商,我想加入网络”?

BRSKI 的整体流程,就是解决这个问题的。它不是一个单次请求,而是一个多阶段、带证书验证的委托注册过程。

核心思想: 设备(Pledge)通过一个叫“代客注册”(Voucher)的机制,让网络中的“代理人”(Registrar)帮它向“所有者”(MASA)要一张“入场券”。这张入场券就是 Voucher,它证明了设备被授权加入网络。

整个流程可以概括为四个阶段:

  1. 发现与连接: 设备通过 DHCP 或 mDNS 找到网络中的 Registrar。
  2. 身份证明: 设备出示它的 IDevID 证书(出厂时烧录的),证明自己是合法硬件。
  3. 委托请求: Registrar 代表设备向 MASA 请求一个 Voucher。
  4. 安全上线: 设备验证 Voucher 后,接受 Registrar 下发的本地证书(LDevID),正式成为网络成员。

嗯,这里要注意,MASA 是厂商的云服务,它不直接跟设备通信,而是跟 Registrar 通信。这个设计很巧妙,避免了设备直接暴露在公网。

4.2 六步握手协议:EST 信封里的秘密

BRSKI 的交互,本质上是基于 EST(Enrollment over Secure Transport) 协议的扩展。它把整个注册过程封装在 TLS 会话里,保证了通信的机密性和完整性。

我把它拆成六步,你对照着抓包看会非常清晰:

步骤 方向 消息类型 核心内容
1 Pledge → Registrar Discovery “谁是 Registrar?我在这!”
2 Registrar → Pledge Voucher Request “把你的 IDevID 和 nonce 给我,我去找 MASA 要 Voucher。”
3 Registrar → MASA Voucher Request (代理) “MASA,这台设备(IDevID)想加入我的网络,请签发 Voucher。”
4 MASA → Registrar Voucher “Voucher 给你,里面包含了设备公钥和授权信息,我签名了。”
5 Registrar → Pledge Voucher + CA 证书 “这是你的 Voucher,还有我们网络的 CA 证书,你可以验证了。”
6 Pledge → Registrar Enroll (CSR) “Voucher 验证通过,这是我的 CSR,请给我签发本地证书。”

我的经验: 我曾经在调试一个跨厂商互通问题时,卡在步骤 2 和步骤 5 之间。Registrar 返回的 Voucher 格式不对,设备解析失败。后来发现是 MASA 返回的 Voucher 里,assertion 字段的值写错了。记住,Voucher 是一个 CMS 签名结构,任何字段不匹配都会导致握手失败。

这六步,其实可以浓缩成三个关键交互:

  • Pledge ↔ Registrar: 发现、请求 Voucher、最终注册。
  • Registrar ↔ MASA: 代理请求 Voucher。
  • Pledge 内部: 验证 Voucher 签名和 nonce。

4.3 协议状态机:设备的大脑

设备不会傻等。它内部有一个清晰的状态机,管理着整个流程的推进。我习惯用三个核心状态来理解它:

  • INIT (初始状态): 设备刚启动,没有网络连接,没有 IP。它在等待触发条件(比如插上网线)。
  • CONNECTING (连接中): 设备获得了 IP,正在尝试发现 Registrar 并建立 TLS 连接。
  • ENROLLING (注册中): TLS 连接建立,正在进行六步握手。这个状态内部又细分了几个子状态,比如 WAIT_VOUCHER、WAIT_CA、WAIT_CERT。
  • ENROLLED (已注册): 成功获取 LDevID,设备可以正常工作了。
  • ERROR (错误): 任何步骤超时或验证失败,都会进入这个状态。设备会尝试重试或回退。

你想想看,如果没有状态机,设备在收到一个错误的 Voucher 后,可能会一直卡在某个步骤,或者无限重试。状态机定义了清晰的边界和转换条件。

避坑指南: 我曾经遇到一个案例,设备在 WAIT_VOUCHER 状态停留了很长时间,最后超时了。排查发现,Registrar 向 MASA 请求 Voucher 时,网络防火墙拦截了 HTTPS 流量。设备的状态机没有及时检测到底层连接断开,导致它一直傻等。所以,状态机设计时,一定要考虑底层传输层的异常通知。

下面这张图,是我根据 RFC 8995 整理的一个简化状态机,你可以对照着理解:

BRSKI 简化状态机 INIT (初始) CONNECTING (连接中) ENROLLING (注册中) ENROLLED (已注册) ERROR (错误) 触发条件 发现失败 验证失败

4.4 超时与重试机制:网络不总是可靠的

网络环境千差万别。设备可能遇到 Registrar 没启动、MASA 响应慢、或者中间丢包。所以,BRSKI 必须有一套健壮的超时和重试策略。

我个人习惯把超时分为三个层级:

  • 连接超时: 建立 TCP/TLS 连接时,如果 5 秒内没有收到 SYN-ACK 或 ServerHello,设备会认为 Registrar 不可达。
  • 请求超时: 发送 Voucher Request 或 CSR 后,等待响应。默认通常是 10 秒。如果超时,设备会重发请求。
  • 整体流程超时: 整个注册过程(从 INIT 到 ENROLLED)不能无限等待。我见过的实现里,通常会设置一个 5 分钟的总超时。超时后,设备会进入 ERROR 状态,并尝试重新开始。

重试策略: 不是简单的“失败了就重试”。BRSKI 推荐使用 指数退避(Exponential Backoff)。第一次重试等待 1 秒,第二次 2 秒,第三次 4 秒,以此类推,直到最大间隔(比如 64 秒)。这样可以避免网络风暴。

举个例子,设备在发送 Voucher Request 后,如果 10 秒内没收到响应,它会:

  1. 记录一次失败。
  2. 等待 1 秒,重发请求。
  3. 如果又超时,等待 2 秒,再重发。
  4. 如果连续失败 5 次,进入 ERROR 状态,并通知管理员。

我的建议: 在实现或调试时,一定要把超时时间打印到日志里。我曾经遇到一个情况,设备总是重试 3 次后失败,但网络其实没问题。后来发现是 Registrar 的处理时间刚好比超时时间多了 0.5 秒。把超时从 10 秒调整到 15 秒后,问题就解决了。有时候,问题不在协议本身,而在参数配置。

嗯,关于超时,还有一个容易被忽略的点:MASA 的响应时间。MASA 是云服务,它可能需要查询数据库、验证签名,响应时间可能从几百毫秒到几秒不等。如果 Registrar 给 MASA 的超时设置得太短,会导致频繁的重试,甚至误判 MASA 不可用。

好了,这一章的内容就到这里。整体流程、六步握手、状态机、超时重试,这四个部分构成了 BRSKI 协议运行的完整画面。你把这些逻辑理清了,后面看具体的报文细节就会轻松很多。