如何将 JITP 与 AWS IoT Core 结合使用?

上次更新时间:2022 年 3 月 21 日

我想要设置一个即时预置 (JITP) 环境,而且它具有已注册 AWS IoT Core 的自定义根证书颁发机构 (CA)。如何使用 AWS IoT Core 设置 JITP?

简短描述

要使用 AWS IoT Core 设置 JITP 环境,首先为您的 CA 注册 AWS IoT Core。然后,将预置模板附加到您的 CA

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您运行的是最新版本的 AWS CLI

创建自签名根 CA 和验证证书

1.    如果您尚未安装,请安装 OpenSSL

2.    运行以下 OpenSSL 命令以创建设备根 CA 私有密钥:

$ openssl genrsa -out deviceRootCA.key 2048

3.    使用 VIM 文本编辑器创建自定义 OpenSSL.conf 文件。要创建和编辑自定义 OpenSSL.conf 文件,请执行以下操作:
运行以下 VIM 命令以创建自定义 OpenSSL.conf 文件:

$ vi deviceRootCA_openssl.conf

按键盘上的 i 以编辑 .conf 文件。然后复制并粘贴以下内容至文件:

[ req ]
distinguished_name       = req_distinguished_name
extensions               = v3_ca
req_extensions           = v3_ca

[ v3_ca ]
basicConstraints         = CA:TRUE

[ req_distinguished_name ]
countryName              = Country Name (2 letter code)
countryName_default      = IN
countryName_min          = 2
countryName_max          = 2
organizationName         = Organization Name (eg, company)
organizationName_default = AMZ

按键盘上的 esc,然后按 :wq!以保存 .conf 文件。然后,再按 Enter 以退出文件。
注意:为了确认 OpenSSL.conf 文件已创建,您可以运行以下 Linux 命令:

$ cat deviceRootCA_openssl.conf

4.    运行以下 OpenSSL 命令以创建设备根 CA 证书签名请求 (CSR):

$ openssl req -new -sha256 -key deviceRootCA.key -nodes -out deviceRootCA.csr -config deviceRootCA_openssl.conf

5.    运行以下 OpenSSL 命令以创建设备根 CA 证书:

$ openssl x509 -req -days 3650 -extfile deviceRootCA_openssl.conf -extensions v3_ca -in deviceRootCA.csr -signkey deviceRootCA.key -out deviceRootCA.pem

6.    运行以下 AWS CLI 命令以获取您要在其中使用 JITP 的 AWS 区域的注册码:

重要提示:确保以您想要使用 JITP 的区域替换 us-east-2

$ aws iot get-registration-code --region us-east-2

7.    运行以下 OpenSSL 命令以创建验证密钥:

$ openssl genrsa -out verificationCert.key 2048

8.    运行以下 OpenSSL 命令以创建验证证书 CSR:

$ openssl req -new -key verificationCert.key -out verificationCert.csr

然后,在 Common Name(公用名)字段输入 Registration Code(注册码)。例如:Common Name(服务器 FQDN 或您的名字)[]: xxxxxxxx8a33da。将其他字段保留为空。

9.    运行以下 OpenSSL 命令以创建验证证书:

$ openssl x509 -req -in verificationCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out verificationCert.crt -days 500 -sha256

重要提示:要使用 AWS IoT Core 进行认证的验证证书需要您的根 CA 区域的注册码。

如需了解更多信息,请参阅即时预置

创建 JITP 模板

1.    为您的 AWS IoT Core 服务创建 AWS Identity and Access Management (IAM) 角色,然后将其命名为 JITPRole。如需了解说明,请参阅创建日志记录角色(第一步和第二步)。

重要提示:您必须在以下 JITP 模板中包含 IAM 角色的 Amazon Resource Name (ARN)

2.    使用 VIM 文本编辑器,通过执行以下操作创建 JITP 模板 JSON 文件:
运行以下 VIM 命令以创建 JITP 模板 JSON 文件:

$ vi jitp_template.json

重要提示:确保您以 jitp_template.json 作为文件名保存该模板。
按键盘上的 i 以编辑 JITP 模板。然后复制并粘贴以下 JITP 模板至文件:

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" : {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyDocument\" : \"{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [ { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Connect\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:client\\\/${iot:Connection.Thing.ThingName}\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Publish\\\", \\\"iot:Receive\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topic\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Subscribe\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topicfilter\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] } ] }\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

重要提示:为您的 AWS IoT Core 服务将 roleArn 值替换成 IAM 角色 ARN。使用您的 AWS 账户 ID 替换 <ACCOUNT_ID> 值。使用您所在的 AWS 区域替换 us-east-2。按键盘上的 esc,然后按 :wq! 以保存 JITP 模板文件。选择 Enter 以退出文件。

注意:示例 JITP 模板中包含以下 IAM 策略:

您必须登录自己的 AWS 账户才能查看策略链接。如需了解更多信息,请参阅预置模板

使用 AWS IoT Core 注册您的自签名根 CA 证书

运行以下 register-ca-certificate AWS CLI 命令,以将设备根 CA 注册为 AWS IoT Core 中的 CA 证书:

重要提示:确保以您想要使用 JITP 的区域替换 us-east-2

$ aws iot register-ca-certificate --ca-certificate file://deviceRootCA.pem --verification-cert file://verificationCert.crt --set-as-active --allow-auto-registration --registration-config file://jitp_template.json --region us-east-2

注意:添加参数 --registration-config 会把您创建的 JITP 模板附加到 CA 证书之上。命令响应将返回 CA 证书的 ARN。

如需了解更多信息,请参阅注册您的 CA 证书

创建设备证书与执行 JITP

重要提示:确保您使用创建原设备根 CA 文件时所在的相同目录。

1.    下载 RootCA1,并使用 awsRootCA.pem 为文件名进行保存。
注意:RootCA1 用于向 AWS IoT Core 发布请求时的服务器端身份验证。如需了解更多信息,请参阅用于服务器身份验证的 CA 证书

2.    运行以下 OpenSSL 命令以创建设备私有密钥:

$ openssl genrsa -out deviceCert.key 2048

3.    运行以下 OpenSSL 命令以创建设备 CSR:

$ openssl req -new -key deviceCert.key -out deviceCert.csr

重要提示:示例 JITP 模板要求 ThingName 值等于证书的 CommonName 值。模板还要求 CountryName 值等于 CA 证书中的 Country 值。例如:

Country Name (two-letter code) []:IN
Common Name (eg. server FQDN or YOUR name) []: DemoThing

本文中提供的 JITP 模板还使用 AWS::IoT::Certificate::Country 证书参数,它要求您添加一个值。其他可能的证书参数包括: AWS::IoT::Certificate::Country AWS::IoT::Certificate::Organization AWS::IoT::Certificate::OrganizationalUnit AWS::IoT::Certificate::DistinguishedNameQualifier AWS::IoT::Certificate::StateName AWS::IoT::Certificate::CommonName AWS::IoT::Certificate::SerialNumber AWS::IoT::Certificate::Id

4.    运行以下 OpenSSL 命令以创建设备证书:

$ openssl x509 -req -in deviceCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out deviceCert.crt -days 365 -sha256

5.    运行以下命令以组合根 CA 证书和设备证书:

$ cat deviceCert.crt deviceRootCA.pem > deviceCertAndCACert.crt

6.    使用 Eclipse Mosquitto 向 AWS IoT Core 发起测试发布调用,并且启动 JITP 进程。

注意:您还可以使用 AWS 设备开发工具包对 AWS IoT Core 进行发布调用。

示例 Eclipse Mosquitto 测试发布调用命令

重要提示:在运行命令前,使用您自己的终端节点替换 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com 。要确认您自己的终端节点,打开 AWS IoT Core 控制台。然后,选择 Settings(设置)。您的终端节点将列在 Custom endpoint(自定义终端节点)窗格当中。

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCertAndCACert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  foo/bar -i  anyclientID --tls-version tlsv1.2 -m "Hello" -d

来自 Eclipse Mosquitto 测试发布调用命令的示例响应

Client anyclientID sending CONNECT  
  Error: The connection was lost. // The error is expected for the first connect call

注意:测试发布调用第一次失败。当 AWS IoT Core 收到测试发布调用时,它会创建一个证书、策略和事物。它还会将策略附加到证书,然后将证书附加到事物。在您下次执行 JITP 时,第一个创建的 IoT 策略就是要使用的策略。不会创建新的 IoT 策略。

7.    执行以下操作以确认所需资源已创建:打开 AWS IoT Core 控制台。选择 Manage(管理)。选择 Things(事物)。 选择 DemoThing
验证证书已创建,而且它处于 ACTIVE(活动)状态。
然后,选择 Policies(策略)并验证已附加 IAM 策略。

在一般操作中使用设备证书

注意:添加到发布命令中的 Client ID 的值必须与 JITP 进程期间所创建的 ThingName 相同。添加到发布命令的 Topic Name 还必须采用 ThingName/* 格式。在下次发布调用中,您可以使用 deviceCert.crt 以取代 deviceCertAndCACert.crt

1.    打开 AWS IoT Core 控制台

2.    选择 Test(测试)。

3.    对于订阅主题,输入 DemoThing/test

4.    对 AWS IoT Core 运行以下 Eclipse Mosquitto 发布调用命令:

重要提示:在运行命令前,使用您自己的终端节点替换 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com 。要确认您自己的终端节点,打开 AWS IoT Core 控制台。然后,选择 Settings(设置)。您的终端节点将出现在 Custom endpoint(自定义终端节点)窗格当中。另外,确保您使用由您的自定义根 CA 生成的自定义设备证书。

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  DemoThing/test -i  DemoThing --tls-version tlsv1.2 -m "Hello" -d

在运行命令以后,您将看到在 AWS IoT Core Test 控制台上收到的消息。

创建更多设备证书

要创建更多设备证书并注册到 AWS IoT Core,重复创建设备证书与执行 JITP部分所述的步骤。

其他 JITP 模板

要从证书的 CommonName 字段提取 ThingName 值并在策略中提供管理员权限,请使用以下 JITP 模板:

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" : {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyDocument\" : \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"iot:*\\\",\\\"Resource\\\":\\\"*\\\"}]}\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

要从证书的 CommonName 字段提取 ThingName 值并提供一个预定义的策略名称,请使用以下 JITP 模板:

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"AttributePayload\" : { \"version\" : \"v1\", \"country\" : {\"Ref\" : \"AWS::IoT::Certificate::Country\"}} } }, \"certificate\" : { \"Type\" : \"AWS::IoT::Certificate\", \"Properties\" : { \"CertificateId\": {\"Ref\" : \"AWS::IoT::Certificate::Id\"}, \"Status\" : \"ACTIVE\" } }, \"policy\" :  {\"Type\" : \"AWS::IoT::Policy\", \"Properties\" : { \"PolicyName\" :  \"Policy_Name\"} } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

重要提示:使用您选择的策略名称取代 Policy_Name


这篇文章对您有帮助吗?


您是否需要账单或技术支持?