【发布时间】:2017-09-21 05:07:20
【问题描述】:
我正在使用 AWS signV4 对调用 AWS API Gateway 的请求进行签名。 使用带有标头的请求不适合我的用例,因此主动使用签名的 url 和查询字符串。
我使用了AWS Sample Python 示例,该示例非常适合创建 IAM 用户。
在两种情况下(IAM 创建、API 网关调用)都使用相同的访问密钥和秘密,因此绝对不是访问密钥/秘密错误的问题。
我看到的主要问题是我得到的签名与 API Gateway 认为我应该发送的签名不同。
我已经添加了所有记录的查询字符串,但仍然出现以下错误。
我在这里错过了什么?
这里是请求网址:
https://*******.execute-api.us-east-1.amazonaws.com/******?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=**********%2F20170424%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20170424T124521Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=**********821742cee7661ef3a0ab1e5c
在将它与 execute-api 服务一起使用时,我收到了以下错误:
{
"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.\n\nThe Canonical String for this request should have been\n'GET\n/*******\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=*********%2F20170424%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20170424T124521Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host\nhost:*******.execute-api.us-east-1.amazonaws.com\n\nhost\n*********'\n\nThe String-to-Sign should have been\n'AWS4-HMAC-SHA256\n20170424T124521Z\n20170424/us-east-1/execute-api/aws4_request\n**********'\n"
}
我还使用以下示例检查了 java 实现:AWS Signer Java 但结果是一样的。
【问题讨论】:
-
您是说用于登录错误消息的规范字符串和字符串绝对逐字节地与您的代码在这些中间步骤中生成的相同?如果您确定这是真的,那么只剩下两种有意义的可能性:您的密钥中的复制/粘贴错误,或者 API 网关中的怪癖。对于任何给定的请求,只有 1 个有效的规范请求;对于任何给定的规范请求,只有 1 个有效的字符串要签名,而对于任何给定的字符串要签名,只有 1 个有效的签名。这一切都是非常确定的。
-
明白了,谢谢
标签: java python api amazon-web-services aws-api-gateway