本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用实例集预调配来预调配没有设备证书的设备
通过使用 Amazon IoT 实例集预调配,Amazon IoT 可以在设备首次连接到 Amazon IoT 时生成设备证书和私有密钥,并将它们安全地传递到设备。Amazon IoT 将提供由 Amazon Root 证书颁发机构 (CA) 签署的客户端证书
使用实例集预调配的方法有两种:
通过申请进行预调配
设备在制造时可以嵌入预调配申请证书和私有密钥(这是特殊用途凭证)。如果将这些证书注册到 Amazon IoT,服务可以交换它们,作为设备可用于常规操作的唯一设备证书。此过程包括以下步骤:
在交付设备之前
-
调用
CreateProvisioningTemplate
以创建预调配模板。此 API 返回模板 ARN。有关更多信息,请参阅 设备预调配 MQTT API。您还可以从 Amazon IoT 控制台创建实例集预调配模板。
-
从导航窗格中选择 Connect(连接),然后选择 Fleet provisioning templates(实例集预调配模板)。
-
选择 Create template(创建模板),再按照提示操作。
-
-
创建用作预调配申请证书的证书以及关联的私有密钥。
-
将这些证书注册到 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/*" ] } ] } -
授予 Amazon IoT 服务权限,以在预调配设备时创建或更新 IoT 资源,例如账户中的事物和证书。通过将
AWSIoTThingsRegistration
托管策略附加到信任 Amazon IoT 服务委托人的 IAM 角色(称为预调配角色)来执行此操作。 -
制造在其中安全地嵌入了预调配申请证书的设备。
设备现在已准备就绪,可以运输到要安装以使用它的位置。
重要
预调配申请私有密钥应始终得到保护,包括在设备上时。我们建议您使用 Amazon IoT CloudWatch 指标和日志来监控滥用迹象。如果您检测到滥用,请关闭预调配申请证书,以使其不能用于设备预调配。
初始化设备以供使用
-
设备使用 Amazon IoT Device SDK、Mobile SDK 和 Amazon IoT Device Client连接到 Amazon IoT,并使用安装在设备上的预调配申请证书向其进行身份验证。
注意
为了安全起见,由
CreateCertificateFromCsr
和CreateKeysAndCertificate
返回的certificateOwnershipToken
将在一小时后过期。必须在certificateOwnershipToken
过期前调用RegisterThing
。如果由CreateCertificateFromCsr
或CreateKeysAndCertificate
创建的证书尚未激活,并且在令牌过期时尚未附加到策略或事物,则该证书将被删除。如果令牌过期,设备可以再次调用CreateCertificateFromCsr
或CreateKeysAndCertificate
以生成新证书。 -
设备通过使用以下选项之一获取永久证书和私有密钥。设备将使用此证书和密钥向 Amazon IoT 进行将来的所有身份验证。
-
调用 CreateKeysAndCertificate 以使用 Amazon 证书颁发机构创建新的证书和私有密钥。
Or
-
调用 CreateCertificateFromCsr 以通过证书签名请求生成证书,这可确保其私有密钥安全。
-
-
从设备中,调用 RegisterThing 以向 Amazon IoT 注册设备并创建云资源。
实例集预调配服务使用预调配模板来定义和创建云资源,如 IoT 事物。该模板可以指定事物的属性和所属的组。在将新事物添加到事物组之前,事物组必须先存在。
-
在设备上保存永久证书后,设备必须断开与它使用预调配申请证书发起的会话的连接,并使用此永久证书重新连接。
设备现在已准备好与 Amazon IoT 正常通信。
由可信用户预调配
在许多情况下,当可信用户(如最终用户或安装技术人员)使用移动应用程序在设备的部署位置配置设备时,设备首次连接到 Amazon IoT。
重要
您必须管理可信用户的访问和权限才能执行此流程。做到这一点的一种方法是为可信用户提供和维护一个账户,该账户对他们进行身份验证,并授予他们对执行此过程所需的 Amazon IoT 特征和 API 操作的访问权限。
在交付设备之前
-
调用
CreateProvisioningTemplate
以创建预调配模板并返回其templateArn
和templateName
。 -
创建由信任用户用于启动预调配过程的 IAM 角色。预调配模板仅允许该用户预调配设备。例如:
{ "Effect": "Allow", "Action": [ "iot:CreateProvisioningClaim" ], "Resource": [ "arn:aws:iot:
aws-region
:aws-account-id
:provisioningtemplate/templateName
" ] } -
授予 Amazon IoT 服务权限,以在预调配设备时创建或更新 IoT 资源,例如账户中的事物和证书。您可以通过将
AWSIoTThingsRegistration
托管策略附加到信任 Amazon IoT 服务委托人的 IAM 角色(称为预调配角色)来执行此操作。 -
提供标识您的可信用户的方法,例如,为他们提供一个账户,该账户可以对他们进行身份验证,并授权他们与注册其设备所需的 Amazon API 操作进行交互。
初始化设备以供使用
-
可信用户登录您的预调配移动应用程序或 Web 服务。
-
移动应用程序或 Web 应用程序使用 IAM 角色并调用
CreateProvisioningClaim
,以从 Amazon IoT 获取临时预调配申请证书。注意
出于安全考虑,
CreateProvisioningClaim
返回的临时预调配申请证书只有五分钟的有效期。在临时预调配申请证书过期之前,以下步骤必须成功地返回有效证书。临时预调配申请证书不会显示在您账户的证书列表中。 -
移动应用程序或 Web 应用程序将临时预调配申请证书以及任何必需的配置信息(如 Wi-Fi 凭证)提供给设备。
-
设备使用临时预调配申请证书,通过 Amazon IoT Device SDK、Mobile SDK 和 Amazon IoT Device Client 连接到 Amazon IoT。
-
设备通过使用临时设置声明证书在连接到 Amazon IoT 的五分钟内使用其中一个选项获得永久证书和私钥。设备将使用这些选项返回的证书和密钥向 Amazon IoT 进行未来的所有身份验证。
-
调用 CreateKeysAndCertificate 以使用 Amazon 证书颁发机构创建新的证书和私有密钥。
Or
-
调用 CreateCertificateFromCsr 以通过证书签名请求生成证书,这可确保其私有密钥安全。
注意
请记住,CreateKeysAndCertificate 或 CreateCertificateFromCsr 必须在使用临时预调配申请证书连接到 Amazon IoT 后的五分钟内返回有效证书。
-
-
设备调用 RegisterThing 以向 Amazon IoT 注册设备并创建云资源。
实例集预调配服务使用预调配模板来定义和创建云资源,如 IoT 事物。该模板可以指定事物的属性和所属的组。在将新事物添加到事物组之前,事物组必须先存在。
-
在设备上保存永久证书后,设备必须断开与它使用临时预调配申请证书发起的会话的连接,并使用此永久证书重新连接。
设备现在已准备好与 Amazon IoT 正常通信。
在 Amazon CLI 中使用预先预调配挂钩
以下流程使用预先预调配挂钩创建预调配模板。此处使用的 Lambda 函数是一个可以修改的示例。
创建预先预调配挂钩并将其应用到预调配模板
-
创建一个具有定义输入和输出的 Lambda 函数。Lambda 函数高度可自定义,需要
allowProvisioning
和parameterOverrides
来创建预调配挂钩。有关创建 Lambda 函数的更多信息,请参阅将 Amazon Lambda 与Amazon命令行界面一起使用。以下是 Lambda 函数输出的示例:
{ "allowProvisioning": True, "parameterOverrides": { "
incomingKey0
": "incomingValue0
", "incomingKey1
": "incomingValue1
" } } -
Amazon IoT 使用基于资源的策略来调用 Lambda,因此您需要授予 Amazon 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
}您也可以从文件加载参数,而不是将其作为命令行参数值完全键入,以节省时间。有关更多信息,请参阅从文件加载 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
" }