

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用实例集预调配来预调配没有设备证书的设备
<a name="provision-wo-cert"></a>

通过使用 AWS IoT 队列配置， AWS IoT 可以在设备首次连接时生成设备证书和私钥并将其安全地交付 AWS IoT 给您的设备。 AWS IoT 提供由 Amazon 根证书颁发机构 (CA) 签署的客户证书。

使用实例集预调配的方法有两种：
+ [通过申请进行预调配](#claim-based)
+ [由可信用户预调配](#trusted-user)

## 通过申请进行预调配
<a name="claim-based"></a>

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

**在交付设备之前**

1. 调用 [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html) 以创建预调配模板。此 API 返回模板 ARN。有关更多信息，请参阅 [设备预调配 MQTT API](fleet-provision-api.md)。

   您也可以在 AWS IoT 控制台中创建队列配置模板。

   1. 从导航窗格中，选择**连接多个设备**下拉菜单。然后，选择**连接多个设备**。

   1. 选择**创建预调配模板**。

   1. 选择最符合您安装流程的**配置场景**。然后选择**下一步**。

   1. 完成模板工作流程。

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

1. 将这些证书注册到限制证书使用的 IoT 策略 AWS IoT 并关联该策略。以下示例物联网策略限制使用与此策略关联的证书来预调配设备。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Connect"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Receive"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topic/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topic/$aws/provisioning-templates/templateName/provision/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/provisioning-templates/templateName/provision/*"
               ]
           }
       ]
   }
   ```

1. 在配置设备时，授予 AWS IoT 服务权限以创建或更新您账户中的物联网资源和证书。为此，请将`AWSIoTThingsRegistration`托管策略附加到信任 AWS IoT 服务委托人的 IAM 角色（称为配置角色）。

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

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

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

**初始化设备以供使用**

1. 设备[AWS IoT Device SDK、Mobile SDK 和 AWS IoT Device Client](iot-sdks.md)使用连接设备上安装的 AWS IoT 配置声明证书并进行身份验证。
**注意**  
为了安全起见，由 `CreateCertificateFromCsr` 和 `CreateKeysAndCertificate` 返回的 `certificateOwnershipToken` 将在一小时后过期。必须在 `certificateOwnershipToken` 过期前调用 `RegisterThing`。如果由 `CreateCertificateFromCsr` 或 `CreateKeysAndCertificate` 创建的证书尚未激活，并且在令牌过期时尚未附加到策略或事物，则该证书将被删除。如果令牌过期，设备可以再次调用 `CreateCertificateFromCsr` 或 `CreateKeysAndCertificate` 以生成新证书。

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

   1. 调用[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)以使用证书颁发机构创建新的 AWS 证书和私钥。

      Or

   1. 调用 [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) 以通过证书签名请求生成证书，这可确保其私有密钥安全。

1. 从设备中，调用 [`RegisterThing`](fleet-provision-api.md#register-thing) 以向 AWS IoT 注册设备并创建云资源。

   实例集预调配服务使用预调配模板来定义和创建云资源，如 IoT 事物。该模板可以指定事物的属性和所属的组。在将新事物添加到事物组之前，事物组必须先存在。

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

设备现已准备就绪，可以与之进行正常通信 AWS IoT。

## 由可信用户预调配
<a name="trusted-user"></a>

在许多情况下，当可信用户（例如最终用户或安装技术人员）使用移动应用程序在其部署位置配置设备时，设备才会首次连接到该设备。 AWS IoT 

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

**在交付设备之前**

1. 调[https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html)用创建配置模板并返回其*templateArn*和*templateName*。

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

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "arn:aws:iot:aws-region:aws-account-id:provisioningtemplate/templateName"
       ]
   }
   ```

1. 在配置设备时，向 AWS IoT 服务授予创建或更新物联网资源的权限，例如您账户中的东西和证书。为此，您可以将`AWSIoTThingsRegistration`托管策略附加到信任 AWS IoT 服务委托人的 IAM *角色（称为配置角色*）。

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

**初始化设备以供使用**

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

1. 移动应用程序或 Web 应用程序使用 IAM 角色并调用 [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html)，以从 AWS IoT获取临时预调配申请证书。
**注意**  
出于安全考虑，`CreateProvisioningClaim` 返回的临时预调配申请证书只有五分钟的有效期。在临时预调配申请证书过期之前，以下步骤必须成功地返回有效证书。临时预调配申请证书不会显示在您账户的证书列表中。

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

1. 设备使用临时预调配申请证书，通过 [AWS IoT Device SDK、Mobile SDK 和 AWS IoT Device Client](iot-sdks.md) 连接到 AWS IoT 。

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

   1. 调用[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)以使用证书颁发机构创建新的 AWS 证书和私钥。

      Or

   1. 调用 [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) 以通过证书签名请求生成证书，这可确保其私有密钥安全。
**注意**  
请记住[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)或[`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr)必须在连接到 AWS IoT 临时配置声明证书后的五分钟内返回有效的证书。

1. 设备调[`RegisterThing`](fleet-provision-api.md#register-thing)用注册设备 AWS IoT 并创建云资源。

   实例集预调配服务使用预调配模板来定义和创建云资源，如 IoT 事物。该模板可以指定事物的属性和所属的组。在将新事物添加到事物组之前，事物组必须先存在。

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

设备现已准备就绪，可以与之进行正常通信 AWS IoT。

## 在 CLI 中使用预配置挂钩 AWS
<a name="hooks-cli-instruc"></a>

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

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

1. 创建一个具有定义输入和输出的 Lambda 函数。Lambda 函数高度可自定义，需要 `allowProvisioning` 和 `parameterOverrides` 来创建预调配挂钩。有关创建 Lambda 函数的更多信息，请参阅[在 AWS 命令行界 AWS Lambda 面中使用](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)。

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

   ```
   {
     "allowProvisioning": True,
     "parameterOverrides": {
       "incomingKey0": "incomingValue0",
       "incomingKey1": "incomingValue1"
     }
   }
   ```

1. AWS IoT 使用基于资源的策略来调用 Lambda，因此您必须授 AWS IoT 予调用 Lambda 函数的权限。
**重要**  
请务必在附加到 Lambda 操作策略的全局条件上下文键中包含 `source-arn` 或 `source-account`，以便防范权限操纵。有关此问题的更多信息，请参阅[防止跨服务混淆座席](cross-service-confused-deputy-prevention.md)。

   以下示例使用 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 将物联网权限授予您的 Lambda。

   ```
   aws lambda add-permission \
       --function-name myLambdaFunction \
       --statement-id iot-permission \
       --action lambda:InvokeFunction \
       --principal iot.amazonaws.com
   ```

1. 使用[create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html)或[update-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/update-provisioning-template.html)命令向模板添加预置挂钩。

   [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html)以下 CLI 示例使用创建具有预置挂钩的配置模板：

   ```
   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 参数](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html)。下面显示了扩展 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",
                   "ThingPrincipalType" : "EXCLUSIVE_THING"
               }
           },
           "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"
   }
   ```