使用 Amazon IoT Core 凭证提供者授权直接调用 Amazon 服务 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon IoT Core 凭证提供者授权直接调用 Amazon 服务

设备可以使用 X.509 证书通过TLS相互身份 Amazon IoT Core 验证协议进行连接。其他 Amazon 服务不支持基于证书的身份验证,但可以使用Amazon 签名版本 4 格式的 Amazon 凭据进行调用。签名版本 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) 协议发送服务器名称指示 (TLS) 扩展名,并在host_name字段中提供完整的端点地址。host_name 字段必须包含您调用的终端节点,并且必须是:

  • aws iot describe-endpoint --endpoint-type iot:CredentialProvider 返回的 endpointAddress

没有正确 host_name 值的设备尝试的连接将失败。

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

Amazon IoT Core 凭证提供者工作流程。
  1. Amazon IoT Core 设备向凭证提供者HTTPS请求安全令牌。该请求包括用于身份验证的设备 X.509 证书。

  2. 凭证提供者将请求转发到 Amazon IoT Core 身份验证和授权模块,以验证证书并验证设备是否有权请求安全令牌。

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

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

  5. Amazon STS 向凭证提供者返回临时的有限权限安全令牌。

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

  7. 设备使用安全令牌对签 Amazon 名版本 4 的 Amazon 请求进行签名。

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

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

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

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

  1. 配置凭证提供者代表您的设备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:ThingNamecredentials-iot:ThingTypeName 作为上下文变量添加到安全令牌。如果设备没有在请求中提供事物名称,则凭证提供程序将提供 credentials-iot:AwsCertificateId 作为上下文变量。您可以将事物名称作为x-amzn-iot-thingnameHTTP请求标头的值传递。

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

  2. 确保执行下一步(创建角色别名)的用户有权将新创建的角色传递给 Amazon IoT Core。以下策略向 Amazon 用户同时授iam:PassRoleiam:GetRole和权限。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" } }
  3. 创建 Amazon IoT Core 角色别名。要直接呼叫 Amazon 服务的设备必须知道在连接时ARN要使用哪个角色 Amazon IoT Core。对角色进行硬编码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用的角色的最大会话持续时间。有关更多信息,请参阅《Identity and Access Managem Amazon ent 用户指南》中的修改角色的最大会话持续时间 (Amazon API)

    有关这方面的更多信息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请求获取安全令牌。提供以下信息:

    • 证书:由于这是通过TLS相互身份验证的HTTP请求,因此您必须在提出请求时向您的客户端提供证书和私钥。使用与注册证书时相同的证书和私钥 Amazon IoT Core。

      要确保您的设备正在与之通信 Amazon IoT Core (而不是模拟它的服务),请参阅服务器身份验证,点击链接下载相应的 CA 证书,然后将其复制到您的设备上。

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

    • 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已启用的终端节点,请参阅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客户端。

    curl --cert your certificate --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"}}

    然后,您可以使用accessKeyIdsecretAccessKey、和sessionToken值对 Amazon 服务请求进行签名。有关演 end-to-end示,请参阅Amazon 安全博客上的 “如何使用 Amazon 凭据提供者博客文章来消除设备中对硬编码 Amazon IoT 凭据的需求”。