AWS IoT
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

授予直接调用 AWS 服务的权限

设备可使用 X.509 证书通过 TLS 双向身份验证协议连接到 AWS IoT。其他 AWS 服务不支持基于证书的身份验证,但可使用 AWS 签名版本 4 格式的 AWS 凭证调用这些服务。签名版本 4 算法通常需要调用方具有访问密钥 ID 和私有访问密钥。AWS IoT 的凭证提供程序允许您使用内置的 X.509 证书作为唯一设备身份来对 AWS 请求进行身份验证。这样就不再需要将访问密钥 ID 和私有访问密钥存储在您的设备上。

凭证提供程序使用 X.509 证书对调用方进行身份验证并颁发具有有限权限的临时安全令牌。令牌可用于对任何 AWS 请求进行签名和身份验证。以这种方式对您的 AWS 请求进行身份验证需要您创建并配置 AWS Identity and Access Management (IAM) 角色并将适当的 IAM 策略附加到该角色,以便凭证提供程序可以代表您代入该角色。

注意

凭证提供程序功能在中国 (北京) 区域中不可用。

下图说明了凭证提供程序工作流程。

AWS IoT 凭证提供程序工作流程。
  1. AWS IoT 设备向凭证提供程序发出 HTTPS 请求来获取安全令牌。该请求包括用于身份验证的设备 X.509 证书。

  2. 凭证提供程序将该请求转发给 AWS IoT 身份验证和授权模块来验证证书并验证它是否有权请求安全令牌。

  3. 如果证书有效并有权请求安全令牌,AWS IoT 身份验证和授权模块将返回成功。否则,它会向设备发送异常。

  4. 成功验证证书之后,凭证提供程序将调用 AWS Security Token Service (AWS STS) 来代入您为它创建的 IAM 角色。

  5. AWS STS 将具有有限权限的临时安全令牌返回给凭证提供程序。

  6. 凭证提供程序将该安全令牌返回给设备。

  7. 设备使用该安全令牌通过 AWS 签名版本 4 对 AWS 请求进行签名。

  8. 请求的服务调用 IAM 来验证签名并根据附加到您为凭证提供程序创建的 IAM 角色的访问策略授权请求。

  9. 如果 IAM 成功验证签名并授权请求,则请求成功。否则,IAM 将发送异常。

下一节介绍如何使用证书来获取安全令牌。它假定您已注册了设备并为它创建并激活了您自己的证书

如何使用证书来获取安全令牌

  1. 配置凭证提供程序代表您的设备代入的 IAM 角色。将以下信任策略附加到该角色。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "credentials.iot.amazonaws.com"}, "Action": "sts:AssumeRole" } }

    对于要调用的每个 AWS 服务,将访问策略附加到该角色。凭证提供程序支持以下策略变量:

    • credentials-iot:ThingName

    • credentials-iot:ThingTypeName

    • credentials-iot:AwsCertificateId

    当设备在向 AWS 服务发出的请求中提供了事物名称时,凭证提供程序会将 credentials-iot:ThingNamecredentials-iot:ThingTypeName 作为上下文变量添加到安全令牌。如果设备没有在请求中提供事物名称,则凭证提供程序将提供 credentials-iot:AwsCertificateId 作为上下文变量。您将事物名称作为 x-amzn-iot-thingname HTTP 请求标头的值进行传递。

    这三个变量仅适用于 IAM 策略,而不适用于 AWS IoT 策略。

  2. 确保执行下一步 (创建角色别名) 的用户有权将此新创建的角色传递给 AWS IoT。以下策略将 iam:GetRoleiam:PassRole 权限都提供给了 AWS 用户。iam:GetRole 权限使用户能够获取有关您刚创建的角色的信息。iam:PassRole 权限使用户能够将角色传递给其他 AWS 服务。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your aws account id:role/your role name" } }
  3. 创建 AWS IoT 角色别名。打算直接调用 AWS 服务的设备必须知道在连接到 AWS IoT 时要使用的角色 ARN。对角色 ARN 进行硬编码并不是一个很好的解决方案,因为它需要您在角色 ARN 发生更改时更新设备。更好的解决方案是使用 CreateRoleAlias API 创建一个指向角色 ARN 的角色别名。如果角色 ARN 发生更改,您只需更新角色别名。无需在设备上进行任何更改。此 API 接受以下参数:

    roleAlias

    必需。一个标识角色别名的任意字符串。它充当角色别名数据模型中的主键。它包含 1-128 个字符,并且必须仅包含字母数字字符以及 =、@ 和 - 符号。允许大写和小写字母字符。

    roleArn

    必需。角色别名所指向的角色的 ARN。

    credentialDurationInSeconds

    可选。凭证有效的时间长度 (以秒为单位)。最小值为 900 秒 (15 分钟)。最大值为 3600 秒 (60 分钟)。默认值为 3,600 秒。

    有关此 API 的更多信息,请参阅 CreateRoleAlias

  4. 将策略附加到设备证书。附加到设备证书的策略必须向设备授予代入角色的权限。您可以通过授予对角色别名执行 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" } }
  5. 向凭证提供程序发出 HTTPS 请求来获取安全令牌。提供以下信息。

    • Certificate:由于这是使用 TLS 双向身份验证的 HTTP 请求,您必须在发出请求时将证书和相应的私有密钥提供给您的客户端。使用您向 AWS IoT 注册您的证书时所使用的相同证书和私有密钥。

      要确保您的设备正在与 AWS IoT (而不是假冒它的服务) 进行通信,请将 RSA Amazon Root CA 1VeriSign Class 3 Public Primary G5 根 CA 证书复制到您的设备。

    • RoleAlias:您为凭证提供程序创建的角色别名的名称。

    • ThingName:您在注册 AWS IoT 事物时创建的事物名称。这作为 x-amzn-iot-thingname HTTP 标头的值进行传递。仅当您使用事物属性作为 AWS IoT 或 IAM 策略中的策略变量时,此值才是必需的。

    在 AWS CLI 中运行以下命令以获取您的 AWS 账户的凭证提供程序终端节点。有关此 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 certficate --key your device certificate key pair -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint/role-aliases/your role alias/credentials

    此命令返回包含 accessKeyIdsecretAccessKeysessionToken 和过期的安全令牌对象。以下 JSON 对象是 curl 命令的示例输出。

    {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}

    然后,您可以使用 accessKeyIdsecretAccessKeysessionToken 值来对向 AWS 服务发出的请求进行签名。有关特定使用案例的端到端演示,请参阅如何通过使用 AWS IoT 凭证提供程序使设备中不再需要硬编码 AWS 凭证