首页 > 解决方案 > 使用预签名 URL“SignatureDoesNotMatch”获取 AWS S3 对象

问题描述

我在爱尔兰地区创建了一个存储桶,并阻止了所有公共访问。此外,我创建了一个脚本来生成一个预签名的 URL 来获取对象。出于某种原因,我总是收到 SignatureDoesNotMatch 错误。我无法理解其背后的原因。下面是我的代码:

let getPresignedUrl = async () => {
    const AWS = require('aws-sdk');
    const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1'});

    console.log(`Starting...`);

    const params = {Bucket: 'mybucket', Key: 'potato.jpeg', Expires: 300};
    const url = await s3.getSignedUrlPromise('getObject', params);
    console.log('The URL is', url); // expires in 60 
};

getPresignedUrl();

这是我收到的消息

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>key</AWSAccessKeyId>
<StringToSign>GET 1603525258 /mybucket/potato.jpeg</StringToSign>
</Error>

标签: amazon-web-servicesamazon-s3pre-signed-url

解决方案


尝试修改这个:

const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1'});

对此:

const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1', signatureVersion: 'v4'});

推荐阅读