当前位置: 首页 > 知识库问答 >
问题:

错误:我们计算的请求签名与您提供的签名不匹配。检查密钥和签名方法

赵英范
2023-03-14

从过去的3天,我被困在同一个问题的签名。我不明白如何走出这一步。

我正在尝试获取一个预签名的网址:

    s3.getSignedUrl('putObject',
    event.pre_signed_url =    
           {Bucket:config.awsBucket,Key:event.filename}
      ); in Node js.

我使用这个预先签名的url将图像文件上传到s3存储桶中,方法是:

   request({
      method:'PUT',
      url: event.pre_signed_url,
      ContentType: 'image/png',
      body: fs.createReadStream('./image.png')}
      , function(err, res, body)
   { if(err)console.log(err); return callback(body); }
  );

并且该文件已成功上传到 s3 存储桶,我可以在 aws s3 存储桶控制台中看到。

问题是,如果我尝试从终端使用curl放置任何其他图像文件,或者尝试在浏览器中打开url,我得到的预签名url会给我带来签名不匹配错误。

如果我做错了,或者我对预签名网址使用的理解是错误的,请指导我。

共有1个答案

徐秋月
2023-03-14

我在使用< code > S3 . getsignedurl(' putObject ' )服务器端,然后尝试使用该Url客户端时遇到了同样的问题。您正在请求上设置参数中未设置的额外标头。

在我的案例中,我注意到(可能与您的案例相关),用所有S3.getSignedUrl创建的签名都考虑了请求头。因此,如果您正在生成一个URL,它将失败,并显示您收到的相同错误消息,除非发送的标题相同。

失败的一个例子:生成如下。。

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000 };
s3.getSignedUrl('putObject', params, function (err, url) {
      if(err){
        return cb(err);
      }
      return cb(null, url)
    });

当生成使用相同 url 时,以下请求将失败。此请求是从浏览器发出的。

RequestMethod: Put
Headers: {
    Accept:*/*
    Accept-Encoding:gzip, deflate, br
    Accept-Language:en-US,en;q=0.9
    Connection:keep-alive
    Content-Length:11768
    Content-Type:application/x-www-form-urlencoded; charset=UTF-8
}

不同之处在于,上面创建的签名不包含内容类型,而请求指定了内容类型。参数需要匹配头,否则抛出的错误将是签名不匹配。

成功示例如下:

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000, Content-Type: 'application/x-www-form-urlencoded; charset=UTF-8' };
s3.getSignedUrl('putObject', params, function (err, url) {
      if(err){
        return cb(err);
      }
      return cb(null, url)
    });
 类似资料:
  • 我正试图在iOS上执行AWS上传。我正在遍历一个对象数组,并将大量大小不同的图像(1000+)上传到S3 bucket中。使用: 当我到达大约第700张图像时,上传过程开始变得非常缓慢,然后我开始在随后的每一次图像上传中收到这些错误: 编辑2:每个Yosuke请求的代码(我只是构建了一个请求对象数组,然后循环遍历数组并上传每个请求):

  • 我试图从我的bucket中获取一个对象,但总是出现“签名不匹配”错误。我从AWS示例代码中获得了签名生成函数,因此我确信这是可行的。我还测试了上传功能,它可以正常工作。我只是在使用get object函数时遇到了问题。我花了大量的时间来验证这篇文章中的所有场景/答案,但什么都没用。所以我在这里寻求你的帮助。 我在标题中遗漏了什么吗?以下是创建的示例规范请求: 编辑1: 我尝试使用编译AWS示例代码

  • 我试图上传图片到s3与预先签署的url从aws SDK生成。 对于上面的返回url,当我试图访问它时,它给出了一个错误 null CORS配置 更新的解决方案

  • 我试图生成签名的URL来上传和下载我的S3 bucket中的对象,但它失败了,“SignatureDoesNotMatch”如下所示。 我明白这是这里描述的问题的症状 而且,是的,我的桶存在。我怎么能用这个水落石出呢?

  • 我正试图上传一张使用AWS S3 SDK的图片。现在,这以前是有效的,但由于某种原因,它停止了工作,我开始得到这个错误: 现在,当我点击链接时,它会给我一个'NoSuchKey'错误: 我真的不明白这一点,因为我的键实际上只是一个字符串。我也试图上传一些东西,所以显然关键不会存在-我正在努力上传它! 另一个教程来自一个博客,我没有它的链接,但我上面的代码与文档中的这个教程相同。我所做的只是把它移到

  • 我有不同的对象来生成保存在S3中的文件。每个对象调用以下函数来保存文件。 我只有以下几个问题。对象要么总是保存文件,要么永远无法保存文件。 错误是 我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅REST身份验证和SOAP身份验证。(服务:S3,状态代码:403,请求ID:79b6c0a2-0d74-1f30-a4bf-246e9631ccd8,扩