

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用機群佈建來佈建沒有裝置憑證的裝置
<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. 向 註冊這些憑證， 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: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 服務許可，以在佈建裝置時建立或更新 IoT 資源，例如帳戶中的物件和憑證。透過將 `AWSIoTThingsRegistration`受管政策連接至信任 AWS IoT 服務主體的 IAM 角色 （稱為佈建角色） 來執行此操作。

1. 製造裝置，並安全地將佈建宣告憑證內嵌其中。

裝置現已準備就緒，可以傳送到將安裝的位置以供使用。

**重要**  
佈建要求私有金鑰應該始終加以保護，包括在裝置上。我們建議您使用 AWS IoT CloudWatch 指標和日誌來監控是否有濫用跡象。如果您偵測到誤用，請關閉佈建宣告憑證，使其無法用於裝置佈建。

**初始化裝置以供使用**

1. 裝置使用 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md)連線至 ，並使用安裝在裝置上的佈建宣告憑證 AWS IoT 來驗證 。
**注意**  
為了安全起見，由 `CreateCertificateFromCsr` 和 `CreateKeysAndCertificate` 傳回的 `certificateOwnershipToken` 會在一小時後過期。必須在 `certificateOwnershipToken` 過期之前呼叫 `RegisterThing`。如果由 `CreateCertificateFromCsr` 或者 `CreateKeysAndCertificate` 建立的憑證尚未啟用，並且在權杖過期時，尚未附加到政策或物件，憑證會遭到刪除。如果字符過期，裝置可以再次呼叫 `CreateCertificateFromCsr` 或 `CreateKeysAndCertificate` 來產生新憑證。

1. 裝置會使用其中一個選項取得永久憑證和私密金鑰。裝置將使用憑證和金鑰進行所有未來的身分驗證 AWS IoT。

   1. 呼叫 [`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert) 以使用憑證授權單位建立新的 AWS 憑證和私有金鑰。

      或

   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 服務許可，以在佈建裝置時建立或更新 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 來連線至 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md)。

1. 裝置會在 AWS IoT 使用暫時佈建宣告憑證連線至 的五分鐘內，使用其中一個選項取得永久憑證和私有金鑰。裝置將使用憑證和金鑰，這些選項會傳回以供所有未來的身分驗證使用 AWS IoT。

   1. 呼叫 [`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert) 以使用憑證授權單位建立新的 AWS 憑證和私有金鑰。

      或

   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 Lambda 與 AWS 命令列界面](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) 將 IoT 許可授予您 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) 命令，將預先啟動設定掛接新增至樣板。

   下列 CLI 範例使用 [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html) 建立具有預先啟動設定掛接的佈建範本：

   ```
   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"
   }
   ```