AWS IoT Fleet Provisioning 演示
简介
AWS IoT Fleet Provisioning 演示展示了为一批 IoT 设备预置唯一证书,
并使用 Fleet Provisioning(队列预置)功能将其注册到 AWS IoT 核心的方法。该演示
展示了能在板上生成公私密钥对的设备是如何利用
通用声明证书(遍及整批设备),为其生成的密钥对
向 AWS IoT 核心请求唯一证书,并在 AWS IoT 核心中将自身注册为
AWS IoT 事物资源的过程。
有关 AWS IoT Fleet Provisioning 功能的更多信息,请参阅
使用 Fleet Provisioning 预置无证书设备
章节(在《AWS IoT 开发者指南》中)。Fleet Provisioning 有两种预置工作流程:
声明预置和
受信任用户预置。此演示展示了如何使用
声明预置工作流程,
通过向 AWS IoT 核心注册通用声明证书为设备预置唯一证书的过程。此演示项目使用
Visual Studio 免费社区版。
在启动 Fleet Provisioning 演示之前,我们建议您使用
corePKCS11 相互身份验证演示 (MQTT)
来连接到 AWS IoT。这将确保 AWS IoT 连接正常运行以及 corePKCS11
凭证管理功能正常执行。
源代码组织
此演示项目被称为 fleet_provisioning_demo.sln
,
可在 GitHub 上的 FreeRTOS 存储库中找到,
其目录如下所示:
FreeRTOS-Plus/Demo/AWS/Fleet_Provisioning_Windows_Simulator/Fleet_Provisioning_With_CSR_Demo
在运行演示前设置 AWS 资源
要使用 AWS IoT 核心的 Fleet Provisioning 功能,您必须设置 IAM 角色和
预置模板(在您的 AWS 帐户中设置)。这些 AWS 资源可通过
AWS 控制台设置,也可通过 AWS CLI 以编程方式进行设置。下列说明将指导您
使用 AWS CLI 来设置这些资源。(在下列示例命令中,将
<aws-region>
和 <aws-account-id>
替换为 AWS Region(区域)and ID,
后两者须与您的 AWS 帐户相关。)有关设置 AWS CLI 的信息,请参阅
AWS CLI 入门指南 。
导航至
FreeRTOS-Plus/Demo/AWS/Fleet_Provisioning_Windows_Simulator/Fleet_Provisioning_With_CSR_Demo
中的演示子文件夹。
- 创建队列预置模板所需的 IAM 角色。
aws iam create-role \
--role-name "FleetProvisioningDemoRole" \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"iot.amazonaws.com"}}]}'
- 将 “AWSIoTThingsRegistration” 策略附加至上一步骤创建的角色上。这
使得该角色可以注册新的 AWS IoT 事物。
aws iam attach-role-policy \
--role-name "FleetProvisioningDemoRole" \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSIoTThingsRegistration
- 创建 AWS IoT 策略, Fleet Provisioning 声明将把其附加至新创建的事物上。
您可以修改 IoT 事物策略示例,使其可同演示一起使用,
该示例可在 "example_iot_thing_policy.json" 文件中找到。在
运行下列命令前,您需修改 “
example_iot_thing_policy.json
” 文件,
将所有出现在尖括号中的下列项目都替换掉:
- 将 <aws-region> 替换成您所选择的 AWS 区域(例如 us-west-2)
- 将 <aws-account-id> 替换成您的 AWS 帐户 ID
aws iot create-policy \
--policy-name FleetProvisioningDemoThingPolicy \
--policy-document file://example_iot_thing_policy.json
- 创建 IoT 事物类型。此事物类型将被附加至 Fleet Provisioning 演示创建的所有事物上,
以方便清理。
aws iot create-thing-type --thing-type-name "fp_demo_things"
- 创建将用于预置演示应用程序的模板资源。此步骤仅需操作一次即可
。有关队列预置模板的更多信息,请参阅
本指南。您
可在
"
example_fleet_provisioning_template.json
" 文件中找到可与演示一同使用的队列预置模板示例。
aws iot create-provisioning-template \
--template-name FleetProvisioningDemoTemplate \
--provisioning-role-arn arn:aws:iam::<aws-account>:role/FleetProvisioningDemoRole \
--template-body file://example_fleet_provisioning_template.json \
--enabled
- 完成队列预置模板后,
您可使用下列 CLI 命令验证其是否创建成功。
aws iot describe-provisioning-template --template-name FleetProvisioningDemoTemplate
- 创建声明证书和私钥,用于演示中的声明预置工作流程
。在命令的输出中,要注意步骤 10 中的 "
certificateId
"。
aws iot create-keys-and-certificate \
--certificate-pem-outfile "ClaimCertificate.pem" \
--public-key-outfile "ClaimPubKey.pem" \
--private-key-outfile "ClaimPrivateKey.pem" \
--set-as-active
- 为声明证书创建 IoT 策略。下列 AWS CLI 命令就是
创建 IoT 策略时需用到的命令。声明证书策略示例可在
"
example_claim_policy.json
" 文件中找到。在
运行 “create-policy” 命令
前,请修改 “example_claim_policy.json
”文件,
将所有出现在尖括号中的下列项目都替换掉:
- 将 <aws-region> 替换成您所选择的 AWS 区域(例如 us-west-2)
- 将 <aws-account-id> 替换成您的 AWS 帐户 ID
aws iot create-policy \
--policy-name FleetProvisioningDemoClaimPolicy \
--policy-document file://example_claim_policy.json
- 将策略附加至声明证书上。将
<Claim-Cert-ID>
替换成
您在步骤 8 中创建的声明证书的 ID。
aws iot attach-policy \
--target "arn:aws:iot:<aws-region>:<aws-account-id>:cert/<Claim-Cert-ID>" \
--policy-name "FleetProvisioningDemoClaimPolicy"
配置演示项目
- 演示使用 FreeRTOS-Plus-TCP TCP/IP 堆栈,
因此请按照所提供的
TCP/IP 入门项目说明进行操作:
- 安装必备组件(例如 WinPCap)。
- 设置静态或动态 IP 地址、网关地址和网络掩码(可选)。
- 设置了 MAC 地址(可选)。
- 在您的主机上选择以太网接口。
上述设置应在
Fleet Provisioning 演示项目的 FreeRTOSConfig.h
文件中修改
。
- 配置
demo_config.h
。用户必须定义下列宏,才能让演示运行:
democonfigMQTT_BROKER_ENDPOINT
democonfigROOT_CA_PEM
democonfigPROVISIONING_TEMPLATE_NAME
- 将您在步骤 6 中创建的声明证书和私钥文件转换为 DER 格式。
这一步可手动完成,也可使用所包含的 Python 脚本 "
fleet_provisioning_demo_setup.py?
" 来完成。
- 方案 1 - 使用所包含的 Python 脚本:
- 此脚本需使用 Python 3。如果您未安装“加密” Python 模块,
则可运行命令
pip3 install cryptography
- 导航至文件夹
...\FreeRTOS-Plus\Demo\AWS\Fleet_Provisioning_Windows_Simulator\Fleet_Provisioning_With_CSR_Demo
- 将密钥和证书 PEM 文件的绝对路径传递至
"
fleet_provisioning_demo_setup.py?
",
它将在脚本运行的同一位置输出等效的 .dat 文件。
- 将
*.dat
文件移至
...\FreeRTOS-Plus\Demo\AWS\Fleet_Provisioning_Windows_Simulator\Fleet_Provisioning_With_CSR_Demo
- 运行脚本:
python3 fleet_provisioning_demo_setup.py -c ClaimCertificate.pem -k ClaimPrivateKey.pem
- 方案 2 - 手动转换 PEM 文件:
- 采用您所喜欢的方法将 PEM 文件转换为 PKCS #11兼容的 DER 格式。
以下是使用 OpenSSL 转换此文件格式的示例:
openssl x509 -outform der -in "ClaimCertificate.pem" -out corePKCS11_Claim_Certificate.dat
openssl pkcs8 -topk8 -inform PEM -outform der -in "ClaimPrivateKey.pem" -out corePKCS11_Claim_Key.dat
- 将
*.dat
文件移至
...\FreeRTOS-Plus\Demo\AWS\Fleet_Provisioning_Windows_Simulator\Fleet_Provisioning_With_CSR_Demo
构建演示项目
此演示项目使用 Visual Studio 的社区免费版。要构建演示,请执行如下操作:
- 从 Visual Studio IDE 中打开 Visual Studio 解决方案文件
FreeRTOS-Plus/Demo/AWS/Fleet_Provisioning_Windows_Simulator/Fleet_Provisioning_With_CSR_Demo/fleet_provisioning_demo.sln
。
- 在 IDE 的 “Build” 菜单中选择 “Build Solution”。
功能
演示展示了 Fleet Provisioning 功能的声明预置工作流程,
该功能为使用 corePKCS11 进行凭据管理的 AWS IoT 核心所有。
- 演示使用步骤 13 中准备的声明凭证连接到 AWS IoT MQTT 代理。
- 演示使用 corePKCS11 创建和存储新的密钥对和证书文件。这些凭据
之后将用于预置新的 AWS IoT 事物。
- 调用 CreateCertificateWithCsr MQTT API
提出证书签名请求 (CSR),以便 AWS IoT 确认并签署证书。
- 调用 RegisterThing MQTT API
创建新的,且使用密钥对和新签名证书的 AWS IoT 事物。
- 预置新事物后,演示将断开与 AWS IoT MQTT 代理的连接。
- 演示使用新创建的事物凭据连接到 AWS IoT MQTT 代理,以验证
该事物是否已成功注册。
prvFleetProvisioningTask()
函数的源代码可在
GitHub 上的 FleetProvisioningDemoExample.c 文件中找到。
下列屏幕截图显示了演示正确执行时的预期输出:
点击放大
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.