亚马逊MWS – 请求签名计算与提供的签名不符
从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
如果您在开始了解某些Amazon文档之后从Googlelogin,那么很可能是因为您的秘密访问密钥中无意的前导空间或尾随空间而看到上面的“请求签名”错误。 先检查一下!
根据我的经验,这个错误只是意味着“你的一个参数是错误的,祝你好运!” 我遇到了这个错误使用S3 SDK。 我试图上传一个文件,但我错误地提供了完整的文件path(“C:\ Users \ addaone \ image.png”)作为密钥而不是文件名。
我也遇到了这个问题。 对我来说,这是因为我不小心把我的桶名称放在前面。
而不是testing/富/酒吧我有/testing/富/酒吧我的桶名称。
我发现这是因为我没有做URL编码 – 看来如果任何传递的参数都是无效的,则返回这个错误 – 它可能与访问密钥没有任何关系。
解决scheme是生成一个新的访问密钥。 我的第一个AWSSecretKey在它上面有可能导致问题的正斜杠,而新的没有正斜杠并且工作。
类似的答案安德鲁(接受的答案),但我的尾随空间不在键上,但在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
另一件要检查的是,你的每个参数可能需要按ASCII值sorting。 “AWSAccessKeyId”参数应该在“Marketplace”之前,但是“AssociatedTag”应该在“AWSAccessId”之后。
当我们尝试上传零字节文件时,也会遇到这种情况。 今天我在这里开了一个bug。
当我的错误与我的angular色configuration有关时,我得到了“计算不匹配”消息
检查您的存储桶的angular色,策略和CORSconfiguration,以确保您有权使用您正在使用的标题。
就我而言,我一直在包括
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" ] } } } ] }
我的是因为我从某人复制环境variables,但他们只是占位符文本。 哈!
我碰到这个问题时,我有一个错误的URL(它有时给我这个错误,有时它说,他们的钥匙不能被发现,意味着404错误)。 这些URL是区分大小写的,所以请确保你是确切的。 我的URL中有“.jpg”,需要“.JPG”
我刚碰到这个错误。 我正在使用PHP,并用我的文件在我的目录上运行了一个scandir()
。
scandir()
函数返回.
并作为数组的前两个索引。 在添加一个条件语句以确保它不会为这些文件创build一个文件后,它就起作用了。
对于在CLI中放置IAM用户的“密码”而不是“私人访问密钥”的用户,可能会出现此问题。 你可能会问“私密密钥”在哪里? 您无法检索它,但可以通过以下方式创build一个新的:
- IAM,用户,pipe理访问密钥,创build访问密钥
- 好的,快速复制密钥! 这是你唯一的机会。 🙂
我收到了与SubmitFeed调用相同的错误,经过几个小时的debugging后发现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,所以我的散列签名再次完好无损。
我遇到了同样的问题,使用curl
命令上传零字节文件到S3 presigned url。
我发现当删除头-H 'Content-Type: application/octet-stream'
然后可以工作。
我正在使用Ruby的aws-sdk v1,而且我得到了这个错误,因为我在调用url_for
时指定了content type
,下面是关于这个文档的示例 。 去除url_for
的content_type
参数,解决了我的问题。
我们在Web服务器上收到这个消息,但是在使用旧版本的AWS C#SDK(1.5.10.0)的控制台应用程序中收到了这个消息。 一旦我们升级到最近它消失了。
检查您的请求标题,在我的情况下,我发送一些额外的标题forms的代码,我复制粘贴(如noob)包含:
HOST: localhost:8080
经过很多努力,我用putObject构造函数来上传File而不是InputStream,并且工作。 不知道什么是错的。
PHP:我有问题,当在s3中添加“/”来表示一个文件夹时,我将它添加到存储桶名称,似乎aws-package的PUTOBJECT命令用“%2F”replace了“/”,所以失败sha256请求的计算,因为它可能看起来:
awsbucket%2Ffolder /文件名
但它可能做了一个预先计算的沙:
awsbucket /文件夹/文件名
解决scheme是预先将文件夹名称添加到文件名。
从:
awsbucket /文件夹
文件名
至:
awsbucket
文件夹/文件名
当使用WebClient在Amazon 3Surl上下载文件时,我遇到了同样的错误信息。 我在这里博客: http : //blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html
我使用的最终解决scheme是在这里find: 获得一个url编码的斜线