签署 Amazon API 请求 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

签署 Amazon API 请求

重要

如果您使用 Amazon SDK(请参阅示例代码和库)或 Amazon 命令行(CLI)工具向 Amazon 发送 API 请求,则可以跳过本部分,因为 SDK 和 CLI 客户端会使用您提供的访问密钥来验证您的请求。除非您有充分的理由不这样做,否则我们建议您始终使用 SDK 或 CLI。

在支持多个签名版本的区域中,手动签名请求意味着您必须指定要使用的签名版本。当您向多区域访问点提供请求时,SDK 和 CLI 会自动切换为使用签名版本 4A,而无需进行其他配置。

您在请求中发送的身份验证信息必须包含签名。要计算签名,首先要将选择的请求元素连接形成一个字符串,称为待签名字符串。然后,您可以使用签名密钥来计算待签字符串的 HMAC 散列消息认证码。

在 Amazon 签名版本 4 中,秘密访问密钥不用于对请求进行签名。相反,您可以使用秘密访问密钥派生签名密钥。派生的签名密钥特定于日期、服务和区域。有关如何在不同编程语言中派生签名密钥的更多信息,请参阅请求签名示例

Signature Version 4 是 Amazon 签名协议。Amazon 还支持 Signature Version 4A 扩展,该扩展支持多区域 API 请求的签名。有关更多信息,请参阅 GitHub 上的 sigv4a-signing-examples 项目。

下图说明了计算签名的一般过程。


            签名各部分的图像,包括待签字符串、签名密钥和已计算签名。
  • 待签字符串取决于请求类型。例如,使用 HTTP 授权标头或查询参数进行身份验证时,可以使用不同的请求元素组合来创建待签字符串。对于 HTTP POST 请求,请求中的 POST 策略是您签名的字符串。

  • 对于签名密钥,此图显示了一系列计算,计算过程中每个步骤的结果都会输入到下一步。最后一步是签名密钥。

  • Amazon 服务收到经身份验证请求时,其会使用请求中包含的身份验证信息重新创建签名。如果签名匹配,则服务将处理该请求。否则,服务将拒绝该请求。

何时签署请求

编写自定义代码来将 API 请求发送给 Amazon 时,必须包含用于签署请求的代码。您可能需要编写自定义代码,原因如下:

  • 您正在使用的编程语言没有对应的 Amazon 开发工具包。

  • 您需要完全控制将请求发送给 Amazon 的方式。

为什么签署请求

签名过程通过以下方式帮助保护请求:

  • 验证请求者的身份

    经过身份验证的请求需要您使用访问密钥(访问密钥 ID、秘密访问密钥)创建的签名。如果您使用的是临时安全凭证,则签名计算还需要安全令牌。有关更多信息,请参阅 Amazon 安全凭证以编程方式访问

  • 保护传输中的数据

    为了防止传输时请求被篡改,一些请求元素将用于计算请求的哈希(摘要),得到的哈希值将包括在请求中。在 Amazon Web Service 收到请求时,它将使用相同信息计算哈希,并将其与您的请求中包括的哈希值进行匹配。如果值不匹配,Amazon 将拒绝请求。

  • 防止潜在的反演攻击

    在大多数情况下,请求必须在请求中的时间戳的 5 分钟内到达 Amazon。否则,Amazon 将拒绝该请求。