我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法

Posted

技术标签:

【中文标题】我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法【英文标题】:The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method 【发布时间】:2015-05-18 16:23:31 【问题描述】:

我对 Amazon Web Service API 的测试请求返回并显示以下错误:

<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
  <Error>
    <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.
    </Message>
  </Error>
  <RequestId>ebe90459-1abd-403e-bfec-6916ebe07e1f</RequestId>
</ItemSearchErrorResponse>

我是这样得出这个结论的:

<?php

$private_key = "XXXXXXXXXXXXXXXXXXXXXX";
$date = urlencode(date('Y-m-d\TH:i:s.Z\Z', time()));
$string_to_sign = "GET webservices.amazon.com /onca/xml/ AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXXXXXA&Keywords=Rocket&Operation=ItemSearch&SearchIndex=Toys&Service=AWSECommerceService&Timestamp=".$date."";
$signature = urlencode(base64_encode(hash_hmac("sha256",$string_to_sign, $private_key, True)));
$url = "http://webservices.amazon.com/onca/xml?AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXXXXXX&Keywords=Rocket&Operation=ItemSearch&SearchIndex=Toys&Service=AWSECommerceService&Timestamp=".$date."&Signature=".$signature."";

header("Location: ".$url."");

?>

我基本上想要一个直接在 url 中签名的 REST 请求(因此是 header 函数),但让我陷入了错误。我仔细检查了我的访问 ID 和密钥,所以我知道它们不是导致问题的原因。这不是生成签名的正确方法吗?

【问题讨论】:

【参考方案1】:

这是 AWS 的谈话内容:“您的凭据不正确”。

【讨论】:

【参考方案2】:

您似乎正在尝试使用 V2 签名来调用 AWS 的 REST API。 请参考完整的AWS REST API call documentation。

我敢打赌,问题是签名前字符串中缺少SignatureVersionSignatureMethodVersion。上面链接的文档的第五步显示了要签名的字符串的示例:

GET\n
elasticmapreduce.amazonaws.com\n
/\n
AWSAccessKeyId=AKIAiosFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

【讨论】:

是的。我修复了它,但只做 \n 并删除所有空格。

以上是关于我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法的主要内容,如果未能解决你的问题,请参考以下文章

我们计算的请求签名与您提供的 aws 签名不匹配

AWSSecretsManagerException:我们计算的请求签名与您提供的签名不匹配

我们计算的请求签名与您提供的签名不匹配 - AWS

为啥会提示“我们计算的请求签名与您提供的签名不匹配”。对于 GET 但不是 PUT 对于 OpenSearch?

使用 Amazon API MWS 进行签名查询

SignatureDoesNotMatch 错误使用 restTemplate 获取 S3 的 url 请求