【问题标题】:Signed URL with AWS ApiGateway使用 AWS ApiGateway 签名的 URL
【发布时间】: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


【解决方案1】:

SigV4 签名和此错误消息并非 API 网关本身所特有的任何内容。 AWS 端的签名算法和验证对于所有 AWS 服务都是通用的。

您能否比较错误消息中的规范字符串和您在发送请求时生成的字符串?这应该可以帮助您识别问题。

另外,通过step-by-step explanation 看看您是否做对了所有事情。常见问题之一是标题名称的大小写敏感性和参数的排序顺序。

【讨论】:

  • 我同意 aws 服务之间的签名没有区别,这在这里很奇怪 - 与 iam 创建用户的相同代码运行良好,但在更改为执行 api 服务后,我得到了错误。至于犬类,除了符号不同外,其他一切都是一样的。因此,如果对于一项服务,它比我们所有的查询参数值和订单都有效,那么与其他服务或主机有什么不同?
  • 感谢您的洞察力。我设法通过更改来解决问题: canonical_uri = '/' 到 canonical_uri = '/prod/olh/securedbrowse' ,现在一切正常。我还更改了我的 java 代码,它也运行良好。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 2023-04-09
  • 2018-02-01
  • 1970-01-01
  • 2021-03-22
  • 2021-11-15
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多