本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過使用 AWS IoT 叢集佈建, AWS IoT 可以在裝置首次連線時產生裝置憑證和私密金鑰,並將其安全地傳遞至 AWS IoT 裝置。 AWS IoT 提供由 Amazon 根憑證授權單位 (CA) 簽署的用戶端憑證。
使用機群佈建的方式有兩種:
透過要求佈建
裝置可以使用內嵌的佈建宣告憑證和私有金鑰 (這是特殊用途的憑證憑證) 來製造。如果這些憑證是在註冊的 AWS IoT,則服務可以將它們交換為裝置可用於一般作業的唯一裝置憑證。此程序包含以下步驟:
在您交付裝置之前
-
呼叫
CreateProvisioningTemplate
來建立佈建範本。這個 API 傳回範本 ARN。如需詳細資訊,請參閱 裝置佈建 MQTT API。您也可以在 AWS IoT 主控台中建立叢集佈建範本。
-
從導覽窗格中,選擇 Connect (連接),然後選擇 Fleet provisioning templates (機群佈建範本)。
-
選擇 Create template (建立範本),並依照提示進行。
-
-
建立要用作佈建宣告憑證的憑證和關聯私有金鑰。
-
將這些憑證註冊到限制憑證使用的 IoT 原則, AWS 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/*" ] } ] } -
在佈建裝置時,授予 AWS IoT 服務權限,以建立或更新您帳戶中的物件和憑證等 IoT 資源。透過將
AWSIoTThingsRegistration
受管政策附加到信任 AWS IoT 服務主體的 IAM 角色 (稱為佈建角色) 來執行此操作。 -
製造裝置,並安全地將佈建宣告憑證內嵌其中。
裝置現已準備就緒,可以傳送到將安裝的位置以供使用。
重要
佈建要求私有金鑰應該始終加以保護,包括在裝置上。我們建議您使用 AWS IoT CloudWatch 指標和記錄來監控濫用的跡象。如果您偵測到誤用,請關閉佈建宣告憑證,使其無法用於裝置佈建。
初始化裝置以供使用
-
裝置會使用連線AWS IoT 裝置 SDK、行動 SDK 和 AWS IoT 裝置用戶端到裝置上安裝的佈建宣告憑證,並 AWS IoT 使用進行驗證。
注意
為了安全起見,由
CreateCertificateFromCsr
和CreateKeysAndCertificate
傳回的certificateOwnershipToken
會在一小時後過期。必須在certificateOwnershipToken
過期之前呼叫RegisterThing
。如果由CreateCertificateFromCsr
或者CreateKeysAndCertificate
建立的憑證尚未啟用,並且在權杖過期時,尚未附加到政策或物件,憑證會遭到刪除。如果字符過期,裝置可以再次呼叫CreateCertificateFromCsr
或CreateKeysAndCertificate
來產生新憑證。 -
裝置會使用其中一個選項取得永久憑證和私密金鑰。裝置將使用憑證和金鑰進行所有 future 的驗證 AWS IoT。
-
呼叫CreateKeysAndCertificate以使用憑證授權單位建立新的 AWS 憑證和私密金鑰。
或
-
呼叫 CreateCertificateFromCsr 以從保持私有金鑰安全的憑證簽署要求產生憑證。
-
-
從裝置呼叫 RegisterThing,以向 AWS IoT 註冊裝置,並建立雲端資源。
同時,機群佈建服務會使用佈建範本來定義並建立雲端資源,例如 IoT 物件。範本可以指定物件所屬的屬性與群組。必須先有物件群組,才能將新物件加入其中。
-
在裝置上儲存永久憑證後,裝置必須中斷與佈建宣告憑證初始化的工作階段連線,然後使用永久憑證重新連線。
裝置現在已準備就緒,可以正常通訊 AWS IoT。
由信任的使用者佈建
在許多情況下,當受信任的使 AWS IoT 用者 (例如使用者或安裝技術人員) 使用行動應用程式在其部署位置設定裝置時,裝置會首次連線至裝置。
重要
您必須管理信任之使用者的存取權和許可,才能執行此程序。其中一種方法是為信任的使用者提供和維護帳戶,以驗證他們,並授予他們存取執行此程序所需的 AWS IoT 功能和 API 操作。
在您交付裝置之前
-
呼叫
CreateProvisioningTemplate
以建立佈建範本,並傳回其templateArn
和templateName
。 -
建立受信任使用者用來啟動佈建程序的 IAM 角色。佈建範本只允許該使用者佈建裝置。例如:
{ "Effect": "Allow", "Action": [ "iot:CreateProvisioningClaim" ], "Resource": [ "arn:aws:iot:
aws-region
:aws-account-id
:provisioningtemplate/templateName
" ] } -
在佈建裝置時,授予 AWS IoT 服務權限以建立或更新 IoT 資源,例如帳戶中的項目和憑證。您可以透過將
AWSIoTThingsRegistration
受管政策附加到信任 AWS IoT 服務主體的 IAM 角色 (稱為佈建角色) 來達到此目的。 -
提供識別受信任使用者的方法,例如向他們提供可驗證使用者的帳戶,並授權他們與註冊其裝置所需的 AWS API 作業互動。
初始化裝置以供使用
-
信任的使用者會登入您的佈建行動應用程式或 Web 服務。
-
行動應用程式或 Web 應用程式會使用 IAM 角色並呼叫
CreateProvisioningClaim
,以從 AWS IoT取得暫時佈建宣告憑證。注意
為了安全起見,
CreateProvisioningClaim
傳回的暫時佈建宣告憑證會在五分鐘後過期。在暫時佈建宣告憑證到期之前,下列步驟必須成功傳回有效的憑證。暫時佈建宣告憑證不會出現在您帳戶的憑證清單中。 -
行動應用程式或 Web 應用程式會將暫時佈建宣告憑證以及任何必要的設定資訊 (例如 Wi-Fi 認證) 提供給裝置。
-
裝置會使用暫時佈建宣告憑證,使用 AWS IoT 來連線至 AWS IoT 裝置 SDK、行動 SDK 和 AWS IoT 裝置用戶端。
-
裝置會在連線至 AWS IoT 暫時佈建宣告憑證後的五分鐘內,使用其中一個選項取得永久憑證和私密金鑰。設備將使用這些選項返回的證書和密鑰,以便將 future 進行所有身份驗證 AWS IoT。
-
呼叫CreateKeysAndCertificate以使用憑證授權單位建立新的 AWS 憑證和私密金鑰。
或
-
呼叫 CreateCertificateFromCsr 以從保持私有金鑰安全的憑證簽署要求產生憑證。
注意
請記住CreateKeysAndCertificate或CreateCertificateFromCsr必須在連接到 AWS IoT 臨時佈建聲明證書的五分鐘內返回有效證書。
-
-
裝置會呼叫RegisterThing以向裝置註冊 AWS IoT 並建立雲端資源。
同時,機群佈建服務會使用佈建範本來定義並建立雲端資源,例如 IoT 物件。範本可以指定物件所屬的屬性與群組。必須先有物件群組,才能將新物件加入其中。
-
在裝置上儲存永久憑證之後,裝置必須中斷與使用暫時佈建宣告憑證起始的工作階段的連線,然後使用永久憑證重新連線。
裝置現在已準備就緒,可以正常通訊 AWS IoT。
將預先佈建掛接與 AWS
CLI 搭配使用
下列程序會建立具有預先佈建掛接的佈建範本。這裡使用的 Lambda 函數是一個可修改的範例。
若要建立預先佈建掛接,並將其套用至佈建範本
-
建立具有所定義輸入和輸出的 Lambda 函數。Lambda 函數是可高度自訂的。需有
allowProvisioning
和parameterOverrides
才能建立預先佈建的掛接。如需建立 Lambda 函數的詳細資訊,請參閱AWS Lambda 搭配命 AWS 令列介面使用。以下是 Lambda 函數輸出的範例:
{ "allowProvisioning": True, "parameterOverrides": { "
incomingKey0
": "incomingValue0
", "incomingKey1
": "incomingValue1
" } } -
AWS IoT 使用以資源為基礎的政策來呼叫 Lambda,因此您必須 AWS IoT 授予呼叫 Lambda 函數的權限。
重要
請務必在連接到 Lambda 動作的政策的全域條件內容金鑰中包含
source-arn
或source-account
,以防止許可操作。如需此項目的詳細資訊,請參閱預防跨服務混淆代理人。以下是使用 add-permission 將 IoT 許可授予您 Lambda 的範例。
aws lambda add-permission \ --function-name
myLambdaFunction
\ --statement-id iot-permission \ --action lambda:InvokeFunction \ --principal iot.amazonaws.com -
使用 create-provisioning-template 或 update-provisioning-template 命令,將預先啟動設定掛接新增至樣板。
下列 CLI 範例使用 create-provisioning-template 建立具有預先啟動設定掛接的佈建範本:
aws iot create-provisioning-template \ --template-name
myTemplate
\ --provisioning-role-arnarn:aws:iam:us-east-1:1234564789012:role/myRole
\ --template-bodyfile://template.json
\ --pre-provisioning-hookfile://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
" }