Amazon Web Services
一般参考 (Version 1.0)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

排除 AWS Signature Version 4 错误

在开发实施Signature Version 4 的代码时,您可能从您测试的 AWS 产品收到错误。产生这些错误的原因通常是请求的规范化阶段出现错误、错误地派生或使用了签名密钥,或验证随请求发送的特定于签名的参数失败。

排除 AWS Signature Version 4 标准化错误

请考虑以下请求:

Copy
https://iam.cn-north-1.amazonaws.com.cn/?MaxItems=100 &Action=ListGroupsForUser &UserName=Test &Version=2010-05-08 &X-Amz-Date=20120223T063000Z &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20120223/cn-north-1/iam/aws4_request &X-Amz-SignedHeaders=host &X-Amz-Signature=<calculated value>

如果您不正确地计算规范请求或待签字符串,则服务执行的签名验证步骤将失败。以下示例是典型的错误响应,包括规范字符串和服务计算的待签字符串。通过将返回的字符串与规范字符串以及您计算得出的待签字符串进行比较,可以排除您的计算错误。

Copy
<ErrorResponse xmlns="https://iam.cn-north-1.amazonaws.com.cn/doc/2010-05-08/"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential =AKIAIOSFODNN7EXAMPLE%2F20120223%2Fcn-north-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host host:iam.cn-north-1.amazonaws.com.cn host <hashed-value>' The String-to-Sign should have been 'AWS4-HMAC-SHA256 20120223T063000Z 20120223/cn-north-1/iam/aws4_request <hashed-value>' </Message> </Error> <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId> </ErrorResponse>

对于软件开发工具包测试,我们建议通过基于已知的值验证每个派生步骤,从而进行故障排除。有关更多信息,请参阅 Signature Version 4测试套件

排除 AWS 签名版本 4 凭证范围错误

AWS 产品可验证凭证范围是否正确;凭证参数必须指定正确的服务、区域和日期。例如,以下凭证引用 Amazon RDS 服务:

Copy
Credential=AKIAIOSFODNN7EXAMPLE/20120224/cn-north-1/rds/aws4_request

如果使用相同的凭证将请求提交到 IAM,您将收到以下错误响应:

Copy
<ErrorResponse xmlns="https://iam.cn-north-1.amazonaws.com.cn/doc/2010-05-08/"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>Credential should be scoped to correct service: 'iam'. </Message> </Error> <RequestId>aa0da9de-5f2b-11e1-a2c0-c1dc98b6c575</RequestId>

凭证还必须指定正确的区域。例如,IAM 请求的以下凭证错误地指定了 美国西部(加利福尼亚北部) 区域。

Copy
Credential=AKIAIOSFODNN7EXAMPLE/20120224/us-west-1/iam/aws4_request
Copy
<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>Credential should be scoped to a valid region, not 'us-east-1'. </Message> </Error> <RequestId>8e229682-5f27-11e1-88f2-4b1b00f424ae</RequestId> </ErrorResponse>

如果您向不同于凭证范围所指定区域的其他区域提交请求,则您将从多个区域中的 AWS 产品收到相同类型的无效区域响应。

凭证还必须为请求中的服务和操作指定正确的区域。

用作凭证组成部分的日期必须与 x-amz-date 标头中的日期值匹配。例如,以下 x-amz-date 标头值与它之后的 Credential 参数中使用的日期值不匹配。

Copy
x-amz-date:"20120224T213559Z" Credential=AKIAIOSFODNN7EXAMPLE/20120225/cn-north-1/iam/aws4_request

如果您使用此 x-amz-date 标头和凭证组合,则会收到以下错误响应:

Copy
<ErrorResponse xmlns="https://iam.cn-north-1.amazonaws.com.cn/doc/2010-05-08/"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP: '20120225' != '20120224', from '20120 224T213559Z'.</Message> </Error> <RequestId>9d6ddd2b-5f2f-11e1-b901-a702cd369eb8</RequestId> </ErrorResponse>

过期的签名也可能生成错误响应。例如,以下错误响应是由于签名过期产生的。

Copy
<ErrorResponse xmlns="https://iam.cn-north-1.amazonaws.com.cn/doc/2010-05-08/"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>Signature expired: 20120306T074514Z is now earlier than 20120306T074556Z (20120306T080056Z - 15 min.)</Message> </Error> <RequestId>fcc88440-5dec-11e1-b901-a702cd369eb8</RequestId> </ErrorResponse>

排除 AWS 签名版本 4 密钥签名错误

由于不正确地派生签名密钥或使用密码术而导致的错误更难排除。错误响应还会告诉您签名不匹配。如果您已验证规范字符串和待签字符串正确,则签名不匹配的原因很可能是以下两个问题之一:

  • 秘密访问密钥与您在 Credential 参数中指定的访问密钥 ID 不匹配。

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

要检查私有密钥是否与访问密钥 ID 匹配,可将私有密钥和访问密钥 ID 用于已知可工作的实施。一种方法是使用 AWS 开发工具包之一来编写程序,在程序中使用相关访问密钥 ID 和秘密访问密钥向 AWS 发出简单请求。

要检查您的密钥派生代码是否正确,您可将它与我们的示例派生代码进行对比。有关更多信息,请参阅 说明如何为 Signature 版本 4 派生签名密钥的示例