【问题标题】:Amazon MWS - request signature calculated does not match the signature provided亚马逊 MWS - 计算的请求签名与提供的签名不匹配
【发布时间】:2011-02-16 03:38:26
【问题描述】:

https://mws.amazonservices.com/ 收到以下错误消息:

<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.
</Message>

这是我用来计算请求的 VB.net 代码。出于安全原因,我已删除 SecretKey 和 AWSAccessKeyId。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim sURL As String = "https://mws.amazonservices.com/"

        Dim sRequest As String = ""
        sRequest &= "Acknowledged=" & Server.UrlEncode("false")
        sRequest &= "&Action=" & Server.UrlEncode("GetReportList")
        sRequest &= "&AWSAccessKeyId=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&Marketplace=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&Merchant=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&SignatureMethod=" & Server.UrlEncode("HmacSHA256")
        sRequest &= "&SignatureVersion=" & Server.UrlEncode("2")
        sRequest &= "&Timestamp=" & Server.UrlEncode(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssCST"))
        sRequest &= "&Version=" & Server.UrlEncode("2009-01-01")

        Dim StringToSign As String = "GET\n" & "mws.amazonservices.com\n" & "/\n" & sRequest
        sRequest &= "&Signature=" & Server.UrlEncode(HashString(StringToSign))

        Response.Write("<a href=""" & sURL & "?" & sRequest & """>Click here</a>")

    End Sub

    Public Shared Function HashString(ByVal StringToHash As String) As String
        Dim myEncoder As New System.Text.UTF8Encoding
        Dim Key() As Byte = myEncoder.GetBytes("REMOVED-FOR-SECURITY")
        Dim XML() As Byte = myEncoder.GetBytes(StringToHash)
        Dim myHMACSHA256 As New System.Security.Cryptography.HMACSHA256(Key)
        Dim HashCode As Byte() = myHMACSHA256.ComputeHash(XML)
        Return Convert.ToBase64String(HashCode)
    End Function

【问题讨论】:

  • 它的亚马逊 AWS 或 MWS?

标签: asp.net amazon-web-services


【解决方案1】:

如果您是在开始阅读一些 Amazon 文档后从 Google 登陆这里的,那么您很可能会看到上面的“请求签名”错误,因为您的秘密访问密钥上的前导或尾随空格不小心。先检查一下!

【讨论】:

  • 它实际上是在我的网络应用程序的 web.config 文件中指定的密钥末尾的单引号 - 谢谢!
  • 为我完全修复了它,在我的凭据文件中我的密钥末尾的尾随空格
  • 是的,密钥/秘密不匹配
  • 宾果游戏。我的秘密访问密钥有一个我没有注意到的前导空格。
  • 感谢安德鲁!以下是为其他开发人员检查它的方法:docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/…
【解决方案2】:

根据我的经验,此错误仅表示“您的某个参数有误,祝您好运!”我使用 S3 SDK 遇到了这个错误。我试图上传文件,但我错误地提供了完整的文件路径(“C:\Users\addaone\image.png”)作为密钥,而不仅仅是文件名。

【讨论】:

  • 是的,这也是我的经验!
  • 只是为了分享我的经验,在我的情况下它是端点属性,我在端点名称中使用了存储桶名称(如先前的 aws 错误所建议的那样......)
【解决方案3】:

解决方案是生成一个新的访问密钥。我的第一个 AWSSecretKey 上有可能导致问题的尾部正斜杠,而新的没有任何正斜杠并且可以正常工作。

【讨论】:

  • 所有非字母数字字符似乎都失败了。继续生成新的,直到你得到一个干净的
  • 没有其他解决办法吗?
  • 我重新生成了一个没有任何非字母数字字符的密钥,它可以工作。
  • 这确实有帮助,我的密钥中还有一个 /。我创建了一个新密钥,现在它可以工作了。我正在使用官方的 aws sdk。现在我的键中有“+”(加号),但它可以工作!
【解决方案4】:

我也遇到了这个问题。对我来说,这是因为我不小心在我的存储桶名称前面放了一个 /。

我使用 /test/foo/bar 作为存储桶名称,而不是 test/foo/bar。

【讨论】:

  • 谢谢!花了一个小时试图解决这个问题,我的存储桶名称末尾的所有内容都是“/文件夹”..
【解决方案5】:

我发现这个是因为我没有进行 URL 编码 - 如果传递的任何参数无效,似乎会返回此错误 - 它可能与访问密钥无关。

【讨论】:

  • 特别是,加号 (+) 是可以作为签名的一部分生成的字符。大多数服务器将其翻译为空格 ( ),这与预期的加号签名不符并引发此错误。
【解决方案6】:

要检查的另一件事是,您的每个参数可能都需要按 ASCII 值排序。 “AWSAccessKeyId”参数应位于“Marketplace”之前,但“AssociatedTag”应位于“AWSAccessId”之后。

【讨论】:

    【解决方案7】:

    对 Andrew 的类似回答(已接受的回答),但我的尾随空格不在键上,而是在 S3 上传的元数据上:

    using (AmazonS3Client client = new AmazonS3Client(region))
    {
        PutObjectRequest putObjectRequest = new PutObjectRequest
        {
            ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256,
            InputStream = stream,
            BucketName = s3Bucket,
            Key = key,
            ContentType = "application/octet-stream",
            Timeout = TimeSpan.FromMinutes(60), //http timeout talking to S3, including upload time.
            ReadWriteTimeout = TimeSpan.FromMinutes(5) //timeout reading the input stream
        };
        if (!string.IsNullOrEmpty(fileName))
            putObjectRequest.Metadata.Add("Name", fileName); 
        PutObjectResponse putObjectResponse = client.PutObject(putObjectRequest);
        // Exception in client.PutObject if fileName has leading spaces in Metadata!
    }           
    

    此处调用堆栈:

    The request signature we calculated does not match the signature you provided. Check your key and signing method.
    at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\HttpErrorResponseExceptionHandler.cs:line 116
    at Amazon.Runtime.Internal.ExceptionHandler`1.Handle(IExecutionContext executionContext, Exception exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\ExceptionHandler.cs:line 38
    [...]
    at Amazon.Runtime.AmazonServiceClient.Invoke[TRequest,TResponse](TRequest request, IMarshaller`2 marshaller, ResponseUnmarshaller unmarshaller) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AmazonServiceClient.cs:line 117
    at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Services\S3\Generated\_bcl45\AmazonS3Client.cs:line 3646
    at MoveDocumentDataToDisk.AwsRepository.PutObject(RegionEndpoint region, String s3Bucket, String key, String fileName, Stream stream) in C:\code\clarinetsupportfiles\MoveDocumentDataToDisk\MoveDocumentDataToDisk\Program.cs:line 314
    

    【讨论】:

      【解决方案8】:

      我在使用 WebClient 下载 Amazon 3S url 上的文件时遇到了相同的错误消息。 我在这里写了一篇博客: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

      我使用的最终解决方案在这里找到: GETting a URL with an url-encoded slash

      【讨论】:

        【解决方案9】:

        我是因为我从某人那里复制了环境变量,但他们只有占位符文本。哈!

        【讨论】:

          【解决方案10】:

          当我们尝试上传零字节文件时也会遇到这种情况。我今天打开了一个错误here

          【讨论】:

          • 零字节文件的问题已解决,请查看跟踪的问题here。这是一个工作示例script
          • 我仍然得到这个零字节文件,或者根本没有文件
          【解决方案11】:

          当我的错误与我的角色配置方式有关时,我收到了相同的“计算不匹配”消息

          检查您的存储桶的角色、策略和 CORS 配置,以确保您有权使用您正在使用的标头。

          就我而言,我一直包括

          ACL: 'public-read' 
          

          签名桶的参数以及

          xhr.setRequestHeader('x-amz-acl', 'public-read');
          

          上传图片时。

          我在关联的 Iam 用户中缺少“s3:PutObjectAcl”权限。这是一项行之有效的政策。

          {
            "Version": "2012-10-17",
            "Statement": [
              {
                  "Sid": "Stmt12345",
                  "Effect": "Allow",
                  "Action": [
                      "s3:DeleteObject",
                      "s3:GetObject",
                      "s3:ListBucket",
                      "s3:PutObject",
                      "s3:PutObjectAcl"
                  ],
                  "Resource": [
                      "arn:aws:s3:::mybucketname/*"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "s3:x-amz-acl": [
                              "public-read"
                          ]
                      }
                  }
              }
            ]
          }
          

          【讨论】:

            【解决方案12】:

            当我输入错误的 URL 时遇到了这个问题(有时它给了我这个错误,有时它说找不到密钥,这意味着 404 错误)。这些 URL 区分大小写,因此请确保准确无误。我的网址中有“.jpg”,需要“.JPG”

            【讨论】:

            • 我在尝试使用 ARN 而不是 URL 时遇到错误。
            【解决方案13】:

            我刚刚遇到了这个错误。我正在使用 PHP,并在我的文件目录上运行 scandir()

            scandir() 函数返回 ... 作为数组的前两个索引。在添加条件语句以确保它不会为这些文件创建文件后,它起作用了。

            【讨论】:

              【解决方案14】:

              如果用户在 CLI 中放置了 IAM 用户的“密码”而不是“私人访问密钥”,则可能会出现此问题。您可能会问“私人访问密钥”在哪里?您无法检索它,但您可以通过以下方式创建一个新的:

              • IAM、用户、管理访问密钥、创建访问密钥
              • 好的,快复制密钥!这是你唯一的机会。 :)

              【讨论】:

                【解决方案15】:

                我在调用 SubmitFeed 时遇到了同样的错误,经过几个小时的调试,结果发现 CURL 将我的 POST 请求变成了一个 PUT 请求,这让我的签名无效。

                通过 curl_setopt() 将 CURLINFO_HEADER_OUT 设置为 1 有很大帮助,因此后来调用 curl_getinfo() 时说我的请求是 PUT 请求。

                所以我比较了 Amazon PHP 库中的 CURL 选项和我通过 curl_setopt() 所做的,然后 tataa:Amazon PHP 库就是这样做的:

                curl_setopt(CURLINFO_HEADER_OUT, 'POST');
                

                (或 GET,取决于 self::REQUEST_TYPE)。在我自己的 CURL 请求中执行相同操作将请求从 PUT 变为 POST,因此我的散列签名再次完好无损。

                【讨论】:

                  【解决方案16】:

                  我使用curl 命令将零字节文件上传到 S3 预签名 url 时遇到了同样的问题。

                  我发现当删除标题-H 'Content-Type: application/octet-stream' 然后可以工作。

                  【讨论】:

                    【解决方案17】:

                    我在使用 Ruby 的 aws-sdk v1 时遇到此错误,因为我在调用 url_for 时指定了 content type,在 this example on the docs 之后。删除 url_for 上的 content_type 参数为我解决了这个问题。

                    【讨论】:

                      【解决方案18】:

                      我们是在网络服务器上收到此消息,但不是在使用旧版本 AWS C# SDK (1.5.10.0) 的控制台应用程序中。一旦我们升级到最新版本,它就会消失。

                      【讨论】:

                        【解决方案19】:

                        检查您的请求标头,在我的情况下,我从我复制粘贴的代码中发送了一个额外的标头(如菜鸟),其中包含:

                        HOST: localhost:8080
                        

                        【讨论】:

                          【解决方案20】:

                          经过一番努力,我使用 putObject Constructor 来上传 File 而不是 inputstream,它成功了。 不过不知道出了什么问题。

                          【讨论】:

                            【解决方案21】:

                            PHP:我遇到的问题是,在 s3 中添加“/”来表示文件夹时,我将其添加到存储桶名称中,似乎 aws-package 的 PUTOBJECT 命令将“/”替换为“%2F”,因此它无法对请求进行 sha256 计算,因为它看起来像:
                            awsbucket%2F 文件夹/文件名
                            但它可能对 sha 进行了预计算:
                            awsbucket/文件夹/文件名

                            解决方案是将文件夹名称预先添加到文件名中。

                            来自:
                            awsbucket/文件夹
                            文件名
                            到:
                            awsbucket
                            文件夹/文件名

                            【讨论】:

                              【解决方案22】:

                              我也使用.net core 2.1.300-preview1 遇到了这个问题。更新到 2.1.300-rc1 是解决方案。

                              【讨论】:

                                【解决方案23】:

                                对堆栈的另外 1 个答案:尝试流式传输数据并将 -1 设置为内容长度也会显示此错误

                                【讨论】:

                                  【解决方案24】:

                                  我在 java 中遇到了这个错误,因为我的 AWS_SECRET_ACCESS_KEY 值有误……它错误地指向了我的 pem 文件。相反,我需要使用此处找到的访问密钥的秘密值:https://console.aws.amazon.com/iam/home?region=us-east-1#/security_credentials

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2022-01-18
                                    相关资源
                                    最近更新 更多