本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
授权直接呼叫 Amazon 使用的服务 Amazon IoT Core 凭证提供程序
设备可以使用 X.509 要连接的证书 Amazon IoT Core 使用 TLS 双向身份验证协议。其他 Amazon 服务不支持基于证书的身份验证,但可以使用以下方法调用它们 Amazon 中的证书 Amazon 签名版本 4 格式。这个 签名版本 4 算法 通常要求呼叫者拥有访问密钥 ID 和私有访问密钥。 Amazon IoT Core 有一个证书提供商,允许您使用内置的 X.509 证书 作为唯一的设备身份进行身份验证 Amazon 请求。这样就不再需要将访问密钥 ID 和私有访问密钥存储在您的设备上。
凭证提供商使用来电者进行身份验证 X.509 证书并颁发临时的有限权限安全令牌。该令牌可用于对任何内容进行签名和身份验证 Amazon 请求。这种方式可以验证你的身份 Amazon 请求需要您创建和配置 Amazon Identity and Access Management (IAM) 角色 并将适当的 IAM 策略附加到该角色,以便证书提供商可以代表您代入该角色。有关 Amazon IoT Core 和 IAM 的更多信息,请参阅 的身份和访问管理 Amazon IoT。
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 请求与 Amazon 签名版本 4.
-
请求的服务调用 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 策略,而不适用于 Amazon IoT Core 策略。
-
确保执行下一步(创建角色别名)的用户有权将新创建的角色传递给 Amazon IoT Core。以下政策同时提供两者
iam:GetRole和iam:PassRole对 a 的权限 Amazon 用户。iam:GetRole权限可让用户获取有关您刚创建的角色的信息。这个iam:PassRole权限允许用户将角色传递给另一个人 Amazon 服务。-
{ "Version":"2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/your role name" } }
-
创建一个 Amazon IoT Core 角色别名。要直接拨打电话的设备 Amazon 服务必须知道连接时要使用哪个角色 ARN Amazon IoT Core。 Hard-coding 角色 ARN 不是一个好的解决方案,因为它要求您在角色 ARN 发生变化时更新设备。更好的解决方案是使用
CreateRoleAliasAPI 创建一个指向角色 ARN 的角色别名。如果角色 ARN 发生更改,您只需更新角色别名。无需在设备上进行任何更改。此 API 接受以下参数:roleAlias-
必需。一个标识角色别名的任意字符串。它充当角色别名数据模型中的主键。它包含 1-128 个字符,并且必须仅包含字母数字字符以及 =、@ 和 - 符号。允许大写和小写字母字符。角色别名名称区分大小写。
roleArn-
必需。角色别名所指向的角色的 ARN。
credentialDurationSeconds-
可选。凭证有效的时间长度(以秒为单位)。最小值为 900 秒(15 分钟)。最大值为 43200 秒(12 小时)。默认值为 3600 秒(1 小时)。
重要
这个 Amazon IoT Core 凭证提供者可以颁发最长有效期为 43,200 秒(12 小时)的凭证。凭证的有效期长达 12 小时,有助于通过将凭证缓存更长时间来减少对凭证提供程序的调用次数。
credentialDurationSeconds值必须小于或等于角色别名引用的 IAM 角色的最长会话持续时间。有关更多信息,请参阅 修改角色的最大会话持续时间 (Amazon API) 来自 Amazon 身份和访问管理用户指南。
相关此 API 的更多信息,请参阅 CreateRoleAlias。
-
将策略附加到设备证书。附加到设备证书的策略必须向设备授予代入角色的权限。您可以通过授予对角色别名执行
iot:AssumeRoleWithCertificate操作的权限来做到这一点,如以下示例所示。-
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:AssumeRoleWithCertificate", "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias" } ] }
-
向凭证提供程序发出 HTTPS 请求来获取安全令牌。提供以下信息:
-
Certificate:由于这是使用 TLS 双向身份验证的 HTTP 请求,因此,您在发出请求时必须向客户端提供证书和私有密钥。使用您在注册证书时使用的相同证书和私钥 Amazon IoT Core。
确保您的设备正在与之通信 Amazon IoT Core (而不是冒充它的服务),请参阅 服务器认证,点击链接下载相应的 CA 证书,然后将其复制到您的设备上。
-
RoleAlias:您为证书提供者创建的角色别名的名称。角色别名区分大小写,必须与中创建的角色别名相匹配 Amazon IoT Core。
-
ThingName: 您在注册时创建的事物名称 Amazon IoT Core 事情。这作为
x-amzn-iot-thingnameHTTP 标头的值进行传递。仅当您在中使用事物属性作为策略变量时,才需要此值 Amazon IoT Core 或 IAM 政策。注意
这个 ThingName 你在中提供的
x-amzn-iot-thingname必须与的名称相匹配 Amazon IoT 分配给证书的事物资源。如果不匹配,则返回 403 错误。
在中运行以下命令 Amazon CLI 获取您的凭证提供商终端节点 Amazon Web Services 账户。相关此 API 的更多信息,请参阅 DescribeEndpoint。对于 FIPS-enabled 端点,请参阅 Amazon IoT Core -凭证提供者端点。
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 客户端。注意
这个 角色别名 名称区分大小写,必须与中创建的角色别名相匹配 Amazon IoT。
curl --certyour certificate--keyyour private key-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 服务。有关端到端演示,请参阅 如何消除需求 Hard-Coded Amazon 使用设备中的证书 Amazon IoT 凭证提供商上的博客文章 Amazon 安全博客。 -