2016-12-04 58 views
0

我在为公共 S3存储桶生成签名URL时遇到问题。做PUT请求,当我得到这个问题:为S3创建签名URL时的签名问题

<Error><Code>SignatureDoesNotMatch</Code> 
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> 

的信息的比特 - 我使用:

  • node 5.8版
  • aws-sdk版本2.7.10

我使用这样的aws-sdk

AWS.config.update({ 
    accessKeyId: ACCESS_KEY, 
    secretAccessKey: SECRET_ACCESS_KEY, 
    region: 'eu-west-1' 
}) 
const s3 = new AWS.S3() 

我生成URL是这样的:

const params = { 
    Key: FILE_KEY, 
    Bucket: BUCKET_NAME, 
    ContentType: image/jpeg, 
    Expires: 60, 
    ACL: 'public-read', 
    Metadata: { 
    'Cache-Control': 'max-age=31556926' 
    } 
} 

const signedUrl = s3.getSignedUrl('putObject', params) 

生成的URL看起来是这样的:

https://companyxyz.s3-eu-west-1.amazonaws.com/ 
image/5843df4a15c6fccf4501cab9.jpg? 
AWSAccessKeyId=xxxxxxxxxx& 
Content-Type=image%2Fjpeg& 
Expires=1480843142& 
Signature=YvUEGntDLVUUuyVuDMxF5yXXBnI%3D 
&x-amz-acl=public-read& 
x-amz-meta-cache-control=max-age%3D31556926 
+0

检查您的访问密钥,如下所示:http://stackoverflow.com/a/8002444/2383685。你的代码看起来很好。 – xShirase

+0

谢谢你的建议!我仔细研究了它,但似乎并没有解决我的问题 – nodesto

回答

0

我改变region解决了这个问题。我在eu-central-1中创建了一个新桶,并且一切正常。无论如何,我无法为eu-west-1生成有效的签名网址。

很想听听任何见解。

0

它可能于SIG- V2和V4 SIG

从这里文档相关: http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html 这里 http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

通知,在SIG V4,

https://s3.amazonaws.com/examplebucket/test.txt 
?X-Amz-Algorithm=AWS4-HMAC-SHA256 
&X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request 

您的访问 - key-id是X-Amz-Credential的一部分

而对于sig v2

https://elasticmapreduce.amazonaws.com? 
&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE 

AWSAccessKeyId有它自己的参数。

你的例子表明,你正在使用SIG V2

http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html 还提到,一些地区不支持SIG V2

欧盟(法兰克福)地区 欧盟(伦敦)地区

欧盟(法兰克福)是欧盟中央-1 这很奇怪,因为它的sig v2不应该在欧盟中央-1工作。