本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon IoT Core 凭证提供程序授予直接调用Amazon服务的权限
设备可使用 X.509 证书通过 TLS 双向身份验证协议连接到 Amazon IoT Core。其它 Amazon 服务不支持基于证书的身份验证,但可使用 Amazon Signature Version 4 格式的 Amazon 凭证调用这些服务。Signature Version 4 算法通常需要调用方具有访问密钥 ID 和秘密访问密钥。Amazon IoT Core 的凭证提供程序允许您使用内置的 X.509 证书作为唯一设备身份来对Amazon请求进行身份验证。这样就不再需要将访问密钥 ID 和私有访问密钥存储在您的设备上。
凭证提供程序使用 X.509 证书对调用方进行身份验证并颁发具有有限权限的临时安全令牌。令牌可用于对任何Amazon请求进行签名和身份验证。以这种方式对您的Amazon请求进行身份验证需要您创建并配置 Amazon Identity and Access Management (IAM) 角色并将适当的 IAM policy 附加到该角色,以便凭证提供程序可以代表您代入该角色。有关 Amazon IoT Core 和 IAM 的更多信息,请参阅 适用于 Amazon IoT 的 Identity and Access Management。
Amazon IoT 要求设备将服务器名称指示 (SNI) 扩展host_name 字段中提供完整的终端节点地址。host_name 字段必须包含您调用的终端节点,并且必须是:
-
aws iot describe-endpoint返回的--endpoint-type iot:CredentialProvider endpointAddress。
没有正确 host_name 值的设备尝试的连接将失败。
下图说明了凭证提供程序工作流程。
-
Amazon IoT Core 设备向凭证提供程序发出 HTTPS 请求以获取安全令牌。该请求包括用于身份验证的设备 X.509 证书。
-
凭证提供程序将该请求转发给 Amazon IoT Core 身份验证和授权模块来验证证书并验证设备是否有权请求安全令牌。
-
如果证书有效并有权请求安全令牌,Amazon IoT Core 身份验证和授权模块将返回指示成功的消息。否则,它会向设备发送异常。
-
成功验证证书之后,凭证提供程序将调用 Amazon Security Token Service (Amazon STS) 来代入您为它创建的 IAM 角色。
-
Amazon STS 将具有有限权限的临时安全令牌返回给凭证提供程序。
-
凭证提供程序将该安全令牌返回给设备。
-
设备使用该安全令牌通过Amazon Signature Version 4 对Amazon请求进行签名。
-
请求的服务调用 IAM 来验证签名并根据附加到您为凭证提供程序创建的 IAM 角色的访问策略授权请求。
-
如果 IAM 成功验证签名并授权请求,则请求成功。否则,IAM 将发送异常。
下一节介绍如何使用证书来获取安全令牌。编写此内容时,假定您已注册了设备并为它创建并激活了您自己的证书。
如何使用证书来获取安全令牌
-
配置凭证提供程序代表您的设备代入的 IAM 角色。将以下信任策略附加到该角色。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "credentials.iot.amazonaws.com"}, "Action": "sts:AssumeRole" } }对于要调用的每个Amazon服务,将访问策略附加到该角色。凭证提供程序支持以下策略变量:
-
credentials-iot:ThingName -
credentials-iot:ThingTypeName -
credentials-iot:AwsCertificateId
当设备在向Amazon服务发出的请求中提供了事物名称时,凭证提供程序会将
credentials-iot:ThingName和credentials-iot:ThingTypeName作为上下文变量添加到安全令牌。如果设备没有在请求中提供事物名称,则凭证提供程序将提供credentials-iot:AwsCertificateId作为上下文变量。您将事物名称作为x-amzn-iot-thingnameHTTP 请求标头的值进行传递。这三个变量仅适用于 IAM policy,而不适用于 Amazon IoT Core 策略。
-
-
确保执行下一步(创建角色别名)的用户有权将新创建的角色传递给 Amazon IoT Core。以下策略将
iam:GetRole和iam:PassRole权限都提供给了Amazon用户。iam:GetRole权限可让用户获取有关您刚创建的角色的信息。iam:PassRole权限可让用户将角色传递给其它 Amazon 服务。{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your Amazon Web Services 账户 id:role/your role name" } } -
创建 Amazon IoT Core 角色别名。打算直接调用Amazon服务的设备必须知道在连接到 Amazon IoT Core 时要使用的角色 ARN。对角色 ARN 进行硬编码并不是一个很好的解决方案,因为它需要您在角色 ARN 发生更改时更新设备。更好的解决方案是使用
CreateRoleAliasAPI 创建一个指向角色 ARN 的角色别名。如果角色 ARN 发生更改,您只需更新角色别名。无需在设备上进行任何更改。此 API 接受以下参数:roleAlias-
必需。一个标识角色别名的任意字符串。它充当角色别名数据模型中的主键。它包含 1-128 个字符,并且必须仅包含字母数字字符以及 =、@ 和 - 符号。允许大写和小写字母字符。
roleArn-
必需。角色别名所指向的角色的 ARN。
credentialDurationSeconds-
可选。凭证有效的时间长度 (以秒为单位)。最小值为 900 秒(15 分钟)。最大值为 43200 秒(12 小时)。默认值为 3600 秒(1 小时)。
注意
Amazon IoT Core 凭证提供程序可以颁发凭证,其最大生命周期为 43200 秒(12 小时)。凭证的有效期长达 12 小时,有助于通过将凭证缓存更长时间来减少对凭证提供程序的调用次数。
credentialDurationSeconds值必须小于或等于角色别名引用的 IAM 角色的最长会话持续时间。
相关此 API 的更多信息,请参阅 CreateRoleAlias。
-
将策略附加到设备证书。附加到设备证书的策略必须向设备授予代入角色的权限。您可以通过授予对角色别名执行
iot:AssumeRoleWithCertificate操作的权限来做到这一点,如以下示例所示。{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"iot:AssumeRoleWithCertificate", "Resource":"arn:aws:iot:your region:your_aws_account_id:rolealias/your role alias" } ] } -
向凭证提供程序发出 HTTPS 请求来获取安全令牌。提供以下信息:
-
Certificate:由于这是使用 TLS 双向身份验证的 HTTP 请求,因此,您在发出请求时必须向客户端提供证书和私有密钥。使用您向 Amazon IoT Core 注册您的证书时所使用的相同证书和私有密钥。
要确保您的设备与 Amazon IoT Core(而不是模拟它的服务)进行通信,请参阅服务器身份验证,单击链接以下载相应的 CA 证书,然后将这些证书复制到您的设备中。
-
RoleAlias:您为证书提供者创建的角色别名的名称。
-
ThingName:您在注册事物时创建Amazon IoT Core的事物名称。这作为
x-amzn-iot-thingnameHTTP 标头的值进行传递。仅当您使用事物属性作为 Amazon IoT Core 或 IAM policy 中的策略变量时,此值才是必需的。注意
您提供的
x-amzn-iot-thingname必须与分配给证书的Amazon IoT事物资源相匹配。ThingName如果不匹配,则返回 403 错误。
在 Amazon CLI 中运行以下命令以获取您Amazon Web Services 账户的凭证提供程序终端节点。相关此 API 的更多信息,请参阅 DescribeEndpoint。
aws iot describe-endpoint --endpoint-type iot:CredentialProvider以下 JSON 对象是 describe-endpoint 命令的示例输出。它包含您用于请求安全令牌的
endpointAddress。{ "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com" }使用终端节点向凭证提供程序发出 HTTPS 请求以返回安全令牌。以下示例命令使用
curl,但您可以使用任何 HTTP 客户端。curl --certyour certificate--keyyour device certificate key pair-H "x-amzn-iot-thingname:your thing name" --cacert AmazonRootCA1.pem https://your endpoint/role-aliases/your role alias/credentials此命令返回包含
accessKeyId、secretAccessKey、sessionToken和过期的安全令牌对象。以下 JSON 对象是curl命令的示例输出。{"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}然后,您可以使用
accessKeyId、secretAccessKey和sessionToken值来对向Amazon服务发出的请求进行签名。有关演 end-to-end 示,请参阅Amazon安全博客中的如何通过使用Amazon凭证提供程序使设备中不再需要硬编码Amazon IoT凭证。 -