签署 Amazon API 请求
重要
如果您使用 Amazon SDK(请参阅示例代码和库
在支持多个签名版本的区域中,手动签名请求意味着您必须指定要使用的签名版本。当您向多区域访问点提供请求时,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 将拒绝该请求。