使用队列预置来预置没有设备证书的设备 - AWS IoT
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用队列预置来预置没有设备证书的设备

通过使用 AWS IoT 队列预置,AWS IoT 可以在设备首次连接到 AWS IoT 时生成设备证书和私有密钥,并将它们安全地传递到设备。

使用队列预置的方法有两种:

  • 通过申请

  • 通过可信用户

通过申请进行预配置

设备在制造时可以嵌入预置申请证书和私有密钥(这是特殊用途凭证)。如果将这些证书注册到 AWS IoT,服务可以交换它们,作为设备可用于常规操作的唯一设备证书。此过程包括以下步骤:

在交付设备之前

  1. 调用 CreateProvisioningTemplate 以创建预置模板。此 API 返回模板 ARN。有关更多信息,请参阅设备预置 MQTT API

    您还可以从 AWS IoT 控制台创建队列预置模板。

    1. 从导航窗格中,选择 Onboard (登记),然后选择 Fleet provisioning templates (队列预置模板)

    2. 选择 Create (创建) 并按照提示操作。

  2. 创建用作预置申请证书的证书以及关联的私有密钥。

  3. 将这些证书注册到 AWS IoT 并关联限制证书使用的 IoT 策略。以下示例 IoT 策略限制使用与此策略关联的证书来预置设备。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["iot:Connect"], "Resource": "*" }, { "Effect": "Allow", "Action": ["iot:Publish","iot:Receive"], "Resource": [ "arn:aws:iot:aws-region:aws-account-id:topic/$aws/certificates/create/*", "arn:aws:iot:aws-region:aws-account-id:topic/$aws/provisioning-templates/templateName/provision/*" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/certificates/create/*", "arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/provisioning-templates/templateName/provision/*" ] } ] }
  4. 授予 AWS IoT 服务权限,以在预置设备时创建或更新 IoT 资源,例如账户中的事物和证书。通过将 AWSIoTThingsRegistration 托管策略附加到信任 AWS IoT 服务委托人的 IAM 角色(称为预置角色)来执行此操作。

  5. 制造在其中安全地嵌入了预置申请证书的设备。

设备现在已准备就绪,可以运输到要安装以使用它的位置。

重要

预置申请私有密钥应始终得到保护,包括在设备上时。我们建议您使用 AWS IoT CloudWatch 指标和日志来监控滥用迹象。如果您检测到滥用,请禁用预置申请证书,以使其不能用于设备预置。

初始化设备以供使用

  1. 设备使用 AWS IoT 设备和移动开发工具包 连接到 AWS IoT,并使用安装在设备上的预置申请证书向其进行身份验证。

  2. 设备通过使用以下选项之一获取永久证书和私有密钥。设备将使用此证书和密钥向 AWS IoT 进行将来的所有身份验证。

    1. 调用 CreateKeysAndCertificate 以使用 AWS 证书颁发机构创建新的证书和私有密钥。

      Or

    2. 调用 CreateCertificateFromCsr 以通过证书签名请求生成证书,这可确保其私有密钥安全。

  3. 从设备中,调用 RegisterThing 以向 AWS IoT 注册设备并创建云资源。

    队列预置服务根据预置模板中的定义创建云资源,例如 IoT 事物、事物组和属性。

  4. 在设备上保存永久证书后,设备必须断开与它使用预置申请证书发起的会话的连接,并使用此永久证书重新连接。

设备现在已准备好与 AWS IoT 正常通信。

由可信用户预置

在许多情况下,当可信用户(如最终用户或安装技术人员)使用移动应用程序在设备的部署位置配置设备时,设备首次连接到 AWS IoT。

重要

您必须管理可信用户的访问和权限才能执行此过程。做到这一点的一种方法是为可信用户提供和维护一个账户,该账户对他们进行身份验证,并授予他们对执行此过程所需的 AWS IoT 功能和 API 的访问权限。

在交付设备之前

  1. 调用 CreateProvisioningTemplate 以创建预置模板并返回其 templateArntemplateName

  2. 创建由可信用户用于启动预置过程的 IAM 角色。预置模板仅允许该用户预置设备。例如:

    { "Effect": "Allow", "Action": [ "iot:CreateProvisioningClaim", ], "Resource": [ "arn:aws:aws-region:aws-account-id:provisioningtemplate/templateName" ] }
  3. 授予 AWS IoT 服务权限,以在预置设备时创建或更新 IoT 资源,例如账户中的事物和证书。您可以通过将 AWSIoTThingsRegistration 托管策略附加到信任 AWS IoT 服务委托人的 IAM 角色(称为预置角色)来执行此操作。

  4. 提供识别您的可信用户的方法,例如,为他们提供一个账户,该账户可以对其进行身份验证,并授权他们与注册其设备所需的 AWS API 进行交互

初始化设备以供使用

  1. 可信用户登录到您的预置移动应用程序或 Web 服务。

  2. 移动应用程序或 Web 应用程序使用 IAM 角色并调用 CreateProvisioningClaim,以从 AWS IoT 获取临时预置申请证书。

    注意

    出于安全考虑,CreateProvisioningClaim 返回的临时预置申请证书只有五分钟的有效期。在临时预置申请证书过期之前,以下步骤必须成功地返回有效证书。临时预置申请证书不会显示在您账户的证书列表中。

  3. 移动应用程序或 Web 应用程序将临时预置申请证书以及任何必需的配置信息(如 Wi-Fi 凭据)提供给设备。

  4. 设备使用临时预置申请证书,通过 AWS IoT 设备和移动开发工具包 连接到 AWS IoT。

    注意

    设备必须执行以下步骤,以便它在使用临时预置申请证书连接到 AWS IoT 后的五分钟内调用 RegisterThing

  5. 设备通过使用以下选项之一获取永久证书和私有密钥。设备将使用此证书和密钥向 AWS IoT 进行将来的所有身份验证。

    1. 调用 CreateKeysAndCertificate 以使用 AWS 证书颁发机构创建新的证书和私有密钥。

      Or

    2. 调用 CreateCertificateFromCsr 以通过证书签名请求生成证书,这可确保其私有密钥安全。

  6. 设备调用 RegisterThing 以向 AWS IoT 注册设备并创建云资源。请记住,这必须在使用临时预置申请证书连接到 AWS IoT 后的五分钟内发生。

    队列预置服务根据预置模板中的定义创建云资源,例如 IoT 事物、事物组和属性。

  7. 在设备上保存永久证书后,设备必须断开与它使用临时预置申请证书发起的会话的连接,并使用此永久证书重新连接。

设备现在已准备好与 AWS IoT 正常通信。

在 AWS CLI 中使用预先预置挂钩

以下过程使用预先预置挂钩创建预置模板。此处使用的 Lambda 函数是一个可以修改的示例。

创建预先预置挂钩并将其应用到预置模板

  1. 创建一个具有定义的输入和输出的 Lambda 函数。Lambda 函数可以高度灵活地自定义,创建预先预置挂钩需要 allowProvisioningparameterOverrides。有关创建 Lambda 函数的更多信息,请参阅将 AWS Lambda 与 AWS 命令行界面一起使用

    以下是 Lambda 函数输出的示例:

    { "allowProvisioning": True, "parameterOverrides": { "incomingKey0": "incomingValue0", "incomingKey1": "incomingValue1" } }
  2. AWS IoT 使用基于资源的策略来调用 Lambda,因此您需要授予 AWS IoT 权限以调用 Lambda 函数。

    以下示例使用 add-permission 将 IoT 权限授予您的 Lambda。

    aws lambda add-permission / --function-name myLambdaFunction / --statement-id iot-permission / --action lambda:InvokeFunction / --principal iot.amazonaws.com
  3. 使用 create-provisioning-templateupdate-provisioning-template 命令添加预先预置挂钩到模板。

    以下 CLI 示例使用 create-provisioning-template 创建具有预先预置挂钩的预置模板:

    aws iot create-provisioning template / --template-name myTemplate / --provisioning-role-arn arn:aws:iam:us-east-1:1234564789012:role/myRole / --template-body file://template.json / --pre-provisioning-hook file://hooks.json

    此命令的输出如下所示:

    { "templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/myTemplate", "defaultVersionId": 1, "templateName": myTemplate }

    您也可以从文件加载参数,而不是将其作为命令行参数值完全键入,以节省时间。有关更多信息,请参阅从文件加载 AWS CLI 参数。下面显示了扩展 JSON 格式的 template 参数:

    { "Parameters" : { "DeviceLocation": { "Type": "String" } }, "Mappings": { "LocationTable": { "Seattle": { "LocationUrl": "https://example.aws" } } }, "Resources" : { "thing" : { "Type" : "AWS::IoT::Thing", "Properties" : { "AttributePayload" : { "version" : "v1", "serialNumber" : "serialNumber" }, "ThingName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]}, "ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",{"Ref":"SerialNumber"}]]}, "ThingGroups" : ["widgets", "WA"], "BillingGroup": "BillingGroup" }, "OverrideSettings" : { "AttributePayload" : "MERGE", "ThingTypeName" : "REPLACE", "ThingGroups" : "DO_NOTHING" } }, "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:Publish"], "Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/bar"] }] } } } }, "DeviceConfiguration": { "FallbackUrl": "https://www.example.com/test-site", "LocationUrl": { "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]} } }

    下面显示了扩展 JSON 格式的 pre-provisioning-hook 参数:

    { "targetArn" : "arn:aws:lambda:us-east-1:765219403047:function:pre_provisioning_test", "payloadVersion" : "2020-04-01" }