使用实例集预调配来预调配没有设备证书的设备 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用实例集预调配来预调配没有设备证书的设备

通过使用 Amazon IoT 实例集预调配,Amazon IoT 可以在设备首次连接到 Amazon IoT 时生成设备证书和私有密钥,并将它们安全地传递到设备。Amazon IoT 将提供由 Amazon Root 证书颁发机构 (CA) 签署的客户端证书

使用实例集预调配的方法有两种:

通过申请进行预调配

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

在交付设备之前

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

    您还可以从 Amazon IoT 控制台创建实例集预调配模板。

    1. 从导航窗格中选择 Connect(连接),然后选择 Fleet provisioning templates(实例集预调配模板)。

    2. 选择 Create template(创建模板),再按照提示操作。

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

  3. 将这些证书注册到 Amazon 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. 授予 Amazon IoT 服务权限,以在预调配设备时创建或更新 IoT 资源,例如账户中的事物和证书。通过将 AWSIoTThingsRegistration 托管策略附加到信任 Amazon IoT 服务委托人的 IAM 角色(称为预调配角色)来执行此操作。

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

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

重要

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

初始化设备以供使用

  1. 设备使用 Amazon IoT Device SDK、Mobile SDK 和 Amazon IoT Device Client连接到 Amazon IoT,并使用安装在设备上的预调配申请证书向其进行身份验证。

    注意

    为了安全起见,由 CreateCertificateFromCsrCreateKeysAndCertificate 返回的 certificateOwnershipToken 将在一小时后过期。必须在 certificateOwnershipToken 过期前调用 RegisterThing。如果由 CreateCertificateFromCsrCreateKeysAndCertificate 创建的证书尚未激活,并且在令牌过期时尚未附加到策略或事物,则该证书将被删除。如果令牌过期,设备可以再次调用 CreateCertificateFromCsrCreateKeysAndCertificate 以生成新证书。

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

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

      或者

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

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

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

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

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

由可信用户预调配

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

重要

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

在交付设备之前

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

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

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

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

初始化设备以供使用

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

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

    注意

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

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

  4. 设备使用临时预调配申请证书,通过 Amazon IoT Device SDK、Mobile SDK 和 Amazon IoT Device Client 连接到 Amazon IoT。

  5. 设备通过使用临时设置声明证书在连接到 Amazon IoT 的五分钟内使用其中一个选项获得永久证书和私钥。设备将使用这些选项返回的证书和密钥向 Amazon IoT 进行未来的所有身份验证。

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

      或者

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

    注意

    请记住,CreateKeysAndCertificateCreateCertificateFromCsr 必须在使用临时预调配申请证书连接到 Amazon IoT 后的五分钟内返回有效证书。

  6. 设备调用 RegisterThing 以向 Amazon IoT 注册设备并创建云资源。

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

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

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

在 Amazon CLI 中使用预先预调配挂钩

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

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

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

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

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

    重要

    请务必在附加到 Lambda 操作策略的全局条件上下文键中包含 source-arnsource-account,以便防范权限操纵。有关此问题的更多信息,请参阅 防止跨服务混淆代理

    以下示例使用 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 }

    您也可以从文件加载参数,而不是将其作为命令行参数值完全键入,以节省时间。有关更多信息,请参阅从文件加载 Amazon 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" }