本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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-thingname
HTTP 请求标头的值进行传递。这三个变量仅适用于 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 发生更改时更新设备。更好的解决方案是使用
CreateRoleAlias
API 创建一个指向角色 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-thingname
HTTP 标头的值进行传递。仅当您使用事物属性作为 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 --cert
your 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凭证。 -