开发人员模式密钥预置 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

开发人员模式密钥预置

介绍

本部分介绍了两个选项,可使 IoT 设备获得受信任的 X.509 客户端证书以进行实验室测试。由于设备的功能差异,可能会支持或不支持各种与预置相关的操作,包括板载 ECDSA 密钥生成、私有密钥导入和 X.509 证书注册。此外,不同的使用案例需要不同级别的密钥保护,从板载闪存存储到使用专用加密硬件都有涉及。本部分提供了在设备的加密功能范围内工作的逻辑。

选项 1:从 AWS IoT 导入私有密钥

出于实验室测试目的,如果您的设备允许导入私有密钥,请按照 配置 FreeRTOS 演示 中的说明操作。

选项 2:板载私有密钥生成

如果您的设备具有安全元件,或者如果您想要生成自己的设备密钥对和证书,请按照此处的说明操作。

初始配置

首先,执行 配置 FreeRTOS 演示中的步骤,但跳过最后一步(即,不要执行对 AWS IoT 证书进行格式化)。最终结果应该是 demos/include/aws_clientcredential.h 文件已使用您的设置完成了更新,但 demos/include/aws_clientcredential_keys.h 文件没有更新。

演示项目配置

按照 主板特定的入门指南 中的主板指南说明,打开 Hello World MQTT 演示。在该项目中,打开文件 aws_dev_mode_key_provisioning.c 并将默认设置为零的 keyprovisioningFORCE_GENERATE_NEW_KEY_PAIR 定义更改为一:

#define keyprovisioningFORCE_GENERATE_NEW_KEY_PAIR 1

然后构建并运行演示项目并继续下一步。

公有密钥提取

由于设备尚未预置私有密钥和客户端证书,该演示将无法通过 AWS IoT 的身份验证。但是,Hello World MQTT 演示首先会运行开发人员模式密钥预置,如果还没有私有密钥,则会创建一个。您应该在串行控制台输出开头附近看到类似以下内容的信息:

7 910 [IP-task] Device public key, 91 bytes: 3059 3013 0607 2a86 48ce 3d02 0106 082a 8648 ce3d 0301 0703 4200 04cd 6569 ceb8 1bb9 1e72 339f e8cf 60ef 0f9f b473 33ac 6f19 1813 6999 3fa0 c293 5fae 08f1 1ad0 41b7 345c e746 1046 228e 5a5f d787 d571 dcb2 4e8d 75b3 2586 e2cc 0c

将六行密钥字节复制到名为 DevicePublicKeyAsciiHex.txt 的文件中。然后使用命令行工具“xxd”将十六进制字节解析为二进制:

xxd -r -ps DevicePublicKeyAsciiHex.txt DevicePublicKeyDer.bin

使用“openssl”将二进制编码 (DER) 设备公有密钥格式化为 PEM:

openssl ec -inform der -in DevicePublicKeyDer.bin -pubin -pubout -outform pem -out DevicePublicKey.pem

不要忘记禁用上面启用的临时密钥生成设置。否则,该设备将创建另一个密钥对,您将不得不重复前面的步骤:

#define keyprovisioningFORCE_GENERATE_NEW_KEY_PAIR 0
公有密钥基础设施设置

按照注册 CA 证书中的说明为设备实验室证书创建证书层次结构。在执行使用 CA 证书创建设备证书 部分中描述的序列之前停止。

在这种情况下,设备将不会签署证书请求(即证书服务请求或 CSR),因为创建和签署 CSR 所需的 X.509 编码逻辑已从 FreeRTOS 演示项目中排除,以减少 ROM 大小。出于实验室测试目的,请改为在您的工作站上创建一个私有密钥并使用它来签署 CSR。

openssl genrsa -out tempCsrSigner.key 2048 openssl req -new -key tempCsrSigner.key -out deviceCert.csr

创建证书颁发机构并注册到 AWS IoT 后,请使用以下命令根据上一步中签署的设备 CSR 颁发客户端证书:

openssl x509 -req -in deviceCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out deviceCert.pem -days 500 -sha256 -force_pubkey DevicePublicKey.pem

尽管 CSR 是使用临时私有密钥签署的,但颁发的证书只能与实际的设备私有密钥一起使用。如果您将 CSR 签署人密钥存储在单独的硬件中,并配置您的证书颁发机构,使其仅为已由该特定密钥签署的请求颁发证书,则可以在生产中使用相同的机制。该密钥也应继续由指定的管理员控制。

证书导入

颁发证书后,下一步是将其导入到您的设备中。您还需要导入证书颁发机构 (CA) 证书,因为在使用 JITP 时,首次 AWS IoT 身份验证要取得成功,就需要该证书。在项目中的 aws_clientcredential_keys.h 文件中,将 keyCLIENT_CERTIFICATE_PEM 宏设置为 deviceCert.pem 的内容,并将 keyJITR_DEVICE_CERTIFICATE_AUTHORITY_PEM 宏设置为 rootCA.pem 的内容。

设备授权

按照使用您自己的证书中的说明,将 deviceCert.pem 导入到 AWS IoT 注册表中。您必须创建新的 AWS IoT 事物,将“待处理”的证书和策略附加到您的事物,然后将该证书标记为“活动”。所有这些步骤都可以在 AWS IoT 控制台中手动执行。

在新客户端证书处于活动状态并与某个事物和策略关联后,请再次运行 MQTT Hello World 演示。这一次,将会成功连接到 AWS IoT MQTT 代理。