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

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

孟新知
2023-03-14

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

我在标题中遗漏了什么吗?以下是创建的示例规范请求:

GET
/index.html
    
host:<bucketname>.s3.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20211127T120453Z
    
host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

编辑1:

我尝试使用javac编译AWS示例代码,然后运行它,get对象函数工作正常。但是当添加到我的Android项目中时,它不起作用。为了确保我按原样复制示例代码,我生成了它的jar文件并将生成的jar文件包含在我的项目中。尽管如此,同样的问题。这很令人沮丧。Argg!

EDIT2:最小可重现示例

  1. 从上面的链接下载示例代码
  2. 将代码添加到您的Android项目中,除了com.amazonaws.services.s3.sample.RunAllSamples类。
  3. 在您的活动中添加此调用:GetS3ObjectSample.getS3Object(

共有1个答案

费秦迟
2023-03-14

这是一个有趣的例子,基本上可以归结为HttpURLConnection的Android实现:

com.squareup.okhttp.internal.huc.HttpURLConnectionImpl

行为与JVM提供的实现不同:

太阳。网www.protocol。http。HttpURLConnection

与此相关的区别是,在第323行附近,Android实现检查了以下两个方面:

  • 是否设置了doOutput标志,以及
  • 方法字段是否为"GET"

如果这两个都是真的,它“有益地”将方法更改为“POST”,这意味着基于包含请求方法的规范请求的签名不再有效。这就是为什么其他样本的工作没有问题;因为他们已经在使用除“GET”之外的请求方法,所以它没有改变。

在AWS示例代码中,输出字段设置为:

com/amazonaws/services/s3/example/util/HttpUtils.java:86

因此,我建议继续使用以下定义:

com.amazonaws.services.s3.sample.GetS3ObjectSample.getS3Object(...)

作为如何计算所需授权头的指南,请使用您首选的sane HTTP客户端,而不是:

com.amazonaws.services.s3.sample.util.HttpUtils

随样本提供的类。

 类似资料:
  • 我正试图在iOS上执行AWS上传。我正在遍历一个对象数组,并将大量大小不同的图像(1000+)上传到S3 bucket中。使用: 当我到达大约第700张图像时,上传过程开始变得非常缓慢,然后我开始在随后的每一次图像上传中收到这些错误: 编辑2:每个Yosuke请求的代码(我只是构建了一个请求对象数组,然后循环遍历数组并上传每个请求):

  • 从过去的3天,我被困在同一个问题的签名。我不明白如何走出这一步。 我正在尝试获取一个预签名的网址: 我使用这个预先签名的url将图像文件上传到s3存储桶中,方法是: 并且该文件已成功上传到 s3 存储桶,我可以在 aws s3 存储桶控制台中看到。 问题是,如果我尝试从终端使用curl放置任何其他图像文件,或者尝试在浏览器中打开url,我得到的预签名url会给我带来签名不匹配错误。 如果我做错了,

  • 我试图上传图片到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,扩