Claiming
节点和 ESP RainMaker 服务使用基于 TLS 协议的 MQTT 协议进行加密通信,通过 X.509 证书相互进行身份验证。ESP RainMaker 中的 Claiming 指支持相关功能的芯片通过 ESP RainMaker Claiming 服务(以下简称 Claiming 服务)获得该证书的过程。
所有与 Claiming 服务展开的通信均通过 HTTP REST API 实现,详情请参考 Claiming API 文档。
自身 Claiming
只有通过在 eFuse 中设置了密钥的平台才能实现自身 Claiming,即自身 Claiming 适用于 ESP32-S2、ESP32-C3 和 ESP32-S3。
自身 Claiming 时,固件联网后会从 Claiming 服务中获取凭据,这也是所有支持该功能平台的默认设置。
- 生成 RSA2048 客户端密钥。
- 向 Claiming 服务发送初始化 Claim 请求,其中有效载荷将包含 MAC 地址和平台(ESP32-S2、ESP32-C3 或 ESP32-S3)。
- Claiming 服务返回质询和随机生成的唯一 auth_id。
- 借助芯片生产过程中编入 eFuse 中的密钥,通过 HMAC512 生成响应。
- 将唯一的 auth_id、质询响应和证书签名请求(CSR,嵌入 node_id 作为公共名称,CN)发送至 Claiming 服务。
- 如果质询响应与 Claiming 服务生成的响应一致,将返回客户端证书。
- 使用客户端密钥和证书连接至 ESP RainMaker MQTT 服务。
- 客户端密钥和证书将被永久保存,以便在之后启动服务时使用。
协助 Claiming
协助 Claiming 由移动应用程序驱动,可用于所有支持低功耗蓝牙的平台,但是只有 ESP32 默认使用。协助 Claiming 建立在主机 Claiming 的 API 之上,两者区别在于协助 Claiming 的实际有效载荷由设备而非主机生成和解析,因此无需执行类似于主机 Claiming 的设置。实现协助 Claiming,只需获取最新版应用程序和 GitHub esp-rainmaker 代码,并在 menuconfig
中启用协助 Claiming 和低功耗蓝牙配网。
- idf.py menuconfig -> ESP RainMaker Config -> Use Assisted Claiming
- idf.py menuconfig -> ESP RainMaker App Wi-Fi Provisioning -> Provisioning Transport Method (Bluetooth LE)
启用上述功能之后,如果设备没有云连接凭据,配网期间则会通知移动应用程序需要 Claiming。这样一来,移动应用程序将代表设备交换数据以获得云凭据。由于移动应用程序只是协助设备获得凭据,所以此方式被称为协助 Claiming。其工作流程如下:
主机 Claiming
建议使用自身或协助 Claiming。
主机 Claiming 由开发主机驱动,可以用于所有 ESP32 变型。通常只有当需要创建 fctry 二进制文件时才会使用主机 Claiming,除了 RainMaker 要求的数据外,这些二进制文件还可能包含一些自定义数据。此外,这一方式可以用于测试配置与私有 RainMaker 部署类似的设备。
主机 Claiming 将会使用 ESP RainMaker CLI (esp-rainmaker/cli)。
- 通过主机登录 ESP RainMaker 账号。
- 生成 RSA2048 客户端密钥。
- 向 Claiming 服务发送初始化 Claim 请求,其中有效载荷将包含 MAC 地址和平台。
- 响应返回唯一的 node_id。
- 生成 CN=node_id 的 CSR,并通过 Claim 确认请求发送 CSR。
- 如果 Claim 得到确认,Claiming 服务将返回客户端证书。
使用方法
请确保已经按照这些步骤设置 ESP RainMaker CLI。Claim 开发板方法如下:
开始之前请先退出
idf.py monitor
。
$ cd /path/to/esp-rainmaker/cli
$ ./rainmaker.py login
$ ./rainmaker.py claim $ESPPORT
注意事项
- CLI 将直接从开发板读取 MAC 地址,创建 NVS 分区镜像,并烧录至 flash 中的适当位置。
- Claim 数据存储在
~/.espressif/rainmaker/claim_data/
中。因此当你再次尝试 Claiming 时,如果特定 MAC 地址的 Claim 数据已经存储于此,将会直接使用这一数据而非从 Claiming 服务中获取。 - Claiming 服务将始终为特定用户的同一 MAC 地址返回同一 node_id。