从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
答案 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;你可能会问?您无法检索它,但您可以通过以下方式创建新的
答案 22 :(得分:0)
我刚遇到这个错误。我正在使用PHP,并在我的目录中使用我的文件运行scandir()
。
scandir()
函数返回.
和..
作为数组的前两个索引。添加条件语句后,确保它没有为这些语句创建文件,它可以工作。
答案 23 :(得分:0)
当我有一个错误的网址时遇到了这个问题(它有时会给我这个错误,有时它说他们找不到密钥,这意味着404错误)。这些URL是区分大小写的,因此请确保您是准确的。我的网址中有“.jpg”,需要“.JPG”