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

对 Amazon API 的签名请求进行问题排查

重要

除非您使用 Amazon SDK 或 CLI,否则您必须编写代码来计算在请求中提供身份验证信息的签名。SigV4 签名计算可能十分复杂,我们建议您尽可能使用 Amazon SDK 或 CLI。

在开发可创建已签名请求的代码时,您可能会从 Amazon Web Services收到 HTTP 403 SignatureDoesNotMatch 错误。此类错误表示您对 Amazon 发出的 HTTP 请求中的签名值与 Amazon Web Service 计算出的签名不一致。当权限不允许调用者发出请求时,系统会返回 HTTP 401 Unauthorized 错误。

出现以下情况时,API 请求可能会返回错误:

  • API 请求未签名,并且 API 请求使用的是 IAM 身份验证。

  • 用于签署请求的 IAM 证书不正确或无权调用该 API。

  • 已签名 API 请求的签名与 Amazon 服务计算出的签名不一致。

  • API 请求标头不正确。

注意

请首先将签名协议从 Amazon 签名版本 2(SigV2)更新为 Amazon 签名版本 4(SigV4),然后再探索其他错误解决方案。Amazon S3 等服务和区域不再支持 Sigv2 签名。

凭证错误

确保 API 请求是使用 Sigv4 签署的。如果 API 请求未签名,则可能会收到以下错误消息:Missing Authentication Token添加缺失的签名 并重新发送请求。

确认访问密钥和私有密钥的身份验证凭证准确无误。如果访问密钥不正确,则可能会收到以下错误消息:Unauthorized。确保用于签署请求的实体有权提出请求。有关详细信息,请参阅 排查访问被拒绝错误消息

规范请求和签名字符串错误

如果您在 第 2 步:创建规范请求的哈希第 3 步:创建要签名的字符串 中计算的规范请求有误,则服务执行的签名验证步骤将会失败,并显示以下错误消息:

The request signature we calculated does not match the signature you provided

Amazon 服务收到已签名的请求后,将会重新计算签名。如果两者的值存在差异,则签名不一致。将已签名请求的规范请求和字符串与错误消息中的值进行比较。如果两者有任何差异,请修改签名过程。

注意

您还可以验证您没有通过修改标头或请求的代理发送请求。

例 规范请求示例
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload

要验证密钥是否与访问密钥 ID 匹配,您可以使用已知的有效实施对其进行测试。例如,使用 Amazon SDK 或 Amazon CLI 向 Amazon 发出请求。

API 请求标头

确保您在 第 4 步:计算签名 中添加的 SigV4 授权标头包含与以下内容类似的正确凭证密钥:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature

如果凭证密钥丢失或不正确,您可能会收到以下错误消息:Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter.。请确保 SigV4 授权请求中还包含使用 HTTP Datex-amz-date 标头的请求日期。

凭证范围错误

您在 第 3 步:创建要签名的字符串 中创建的凭证范围可将签名限定为特定的日期、区域和服务。此字符串具有以下格式:

YYYYMMDD/region/service/aws4_request
注意

如果您使用的是 Sigv4a,则该区域未包括在凭证范围内。

日期

如果凭证范围未指定与 x-amz-date 标头相同的日期,则签名验证步骤将失败,并显示以下错误消息:

Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP

如果请求指定了未来时间,则签名验证步骤将失败,并显示以下错误消息:

Signature not yet current: date is still later than date

如果请求已过期,则签名验证步骤将失败,并显示以下错误消息:

Signature expired: date is now earlier than date
区域

如果凭证范围未指定与请求相同的区域,则签名验证步骤将失败,并显示以下错误消息:

Credential should be scoped to a valid Region, not region-code
服务

如果凭证范围未指定与 host 标头相同的服务,则签名验证步骤将失败,并显示以下错误消息:

Credential should be scoped to correct service: 'service'
终止字符串

如果凭证范围没有以 aws4_request 结尾,则签名验证步骤将失败,并显示以下错误消息:

Credential should be scoped with a valid terminator: 'aws4_request'

密钥签名错误

由于不正确地派生签名密钥或使用密码术而导致的错误更难排查。验证规范字符串和待签字符串正确无误后,还可以检查是否存在以下某个问题:

  • 秘密访问密钥与您指定的访问密钥 ID 不匹配。

  • 您的密钥派生代码存在问题。

要验证密钥是否与访问密钥 ID 匹配,您可以使用已知的有效实施对其进行测试。例如,使用 Amazon SDK 或 Amazon CLI 向 Amazon 发出请求。有关示例,请参阅请求签名示例