【问题标题】:Amazon S3 Error: The request signature we calculated does not match the signature you provided. Check your key and signing methodAmazon S3 错误:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法
【发布时间】:2022-01-05 03:13:48
【问题描述】:

我试图从我的存储桶中获取一个对象,但我总是收到“签名不匹配”错误。我从AWS sample code 获得了我的签名生成功能,所以我确信它有效。我还测试了上传功能,它可以工作。我只是在获取对象功能方面遇到了麻烦。我花了很多时间验证post 中的所有场景/答案,但没有任何效果。所以我在这里寻求你的帮助。

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

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 sample code,然后运行它,get object 函数工作正常。但是当添加到我的 Android 项目中时,它不起作用。为了确保按原样复制示例代码,我生成了它的 jar 文件并将生成的 jar 文件包含在我的项目中。不过,同样的问题。这令人沮丧。啊!

EDIT2:最小的可重现示例

  1. 从上面的链接下载示例代码
  2. 将代码添加到您的 Android 项目中,com.amazonaws.services.s3.sample.RunAllSamples 类除外。
  3. 在您的一项活动中添加此呼叫:GetS3ObjectSample.getS3Object(&lt;bucketName&gt;, &lt;regionName&gt;, &lt;awsAccessKey&gt;, &lt;awsSecretKey&gt;);

【问题讨论】:

  • 您能出示minimal reproducible example 用于创建规范请求并签名的代码吗?
  • @AnonCoward 可重现的代码在链接的示例代码中。我按原样使用了规范签名创建功能。但让我看看如何编辑问题以帮助每个人轻松重现问题。

标签: android amazon-web-services amazon-s3


【解决方案1】:

这是一个有趣的问题,基本上归结为HttpURLConnection的Android实现:

com.squareup.okhttp.internal.huc.HttpURLConnectionImpl

与 JVM 提供的实现不同:

sun.net.www.protocol.http.HttpURLConnection

这里的相关区别在于,在323 行附近,Android 实现会同时检查两者:

如果这两个都是真的,它“有帮助”将方法更改为"POST",这意味着基于包含请求方法的canonical request 的签名不再有效。这就是为什么其他样本可以正常工作的原因;因为他们已经在使用"GET"之外的请求方法,所以没有改变。

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

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

所以我建议继续使用以下定义:

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

作为如何计算所需 Authorization 标头的指南,但请使用您首选的健全的 HTTP 客户端而不是:

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

随样本提供的类。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2019-12-01
    • 2015-06-01
    • 2015-12-31
    • 2021-04-11
    • 1970-01-01
    • 2015-05-18
    • 2022-06-30
    相关资源
    最近更新 更多