亚马逊MWS - 计算的请求签名与提供的签名不匹配

时间:2010-05-05 21:55:56

标签: asp.net amazon-web-services

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

24 个答案:

答案 0 :(得分:142)

如果您在开始使用某些亚马逊文档后从Google登陆此处,则由于您的秘密访问密钥上无意中的前导或尾随空间,您很可能会看到上面的“请求签名”错误。先检查一下!

答案 1 :(得分:24)

根据我的经验,这个错误只是意味着&#34;你的一个参数是错误的,祝你好运!&#34;我使用S3 SDK遇到了这个错误。我试图上传文件,但我错误地提供了完整的文件路径(&#34; C:\ Users \ addaone \ image.png&#34;)作为密钥,而不仅仅是文件名。

答案 2 :(得分:19)

我也遇到了这个问题。对我而言,这是因为我不小心在我的桶名前面放了一个/。

而不是test / foo / bar我有/ test / foo / bar我的桶名。

答案 3 :(得分:18)

解决方案是生成一个新的访问密钥。我的第一个AWSSecretKey在它上面有可能导致问题的正斜杠,而新的斜杠没有任何正斜杠并且有效。

答案 4 :(得分:16)

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

答案 5 :(得分:3)

安德鲁的类似答案(接受了答案),但我的尾随空格不在键上,而是在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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

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

就我而言,我一直包括

ACL: 'public-read' 
签署桶的

参数以及

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

上传图片时。

我错过了“s3:PutObjectAcl”,我的关联Iam用户的权限。这是一项有效的政策。

{
  "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"
                ]
            }
        }
    }
  ]
}

答案 11 :(得分:0)

检查你的请求标题,在我的情况下,我发送了一些额外的标题,形成了我复制粘贴的代码(如noob):

HOST: localhost:8080

答案 12 :(得分:0)

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

答案 13 :(得分:0)

经过多次努力,我使用了putObject构造函数来上传文件而不是输入流,并且它有效。 不知道出了什么问题。

答案 14 :(得分:0)

PHP:我有一个问题,当在s3中添加“/”表示文件夹时,我将其添加到存储桶名称,似乎aws-package的PUTOBJECT命令将“/”替换为“%2F”,因此它可能看起来像sha256计算请求的失败:
awsbucket%2Ffolder /文件名
但是它可能用沙子预先计算了: awsbucket /文件夹/文件名

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

自:
awsbucket /文件夹
文件名
于:
awsbucket
文件夹/文件名

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

我们在网络服务器上收到此信息,但未在使用旧版AWS C#SDK(1.5.10.0)的控制台应用中收到此信息。一旦我们升级到最近,它就消失了。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

我在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,因此我的哈希签名再次完好无损。

答案 21 :(得分:0)

对于已放置IAM用户&#34;密码&#34;的用户可能会出现此问题。在CLI而不是&#34;私人访问密钥&#34;。 &#34;私人访问密钥&#34;你可能会问?您无法检索它,但您可以通过以下方式创建新的

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

答案 22 :(得分:0)

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

scandir()函数返回...作为数组的前两个索引。添加条件语句后,确保它没有为这些语句创建文件,它可以工作。

答案 23 :(得分:0)

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