如何将 JITP 与 AWS IoT Core 结合使用?
我想要设置一个即时预置 (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。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前