【问题标题】:Amazon S3 PUT throws "SignatureDoesNotMatch"Amazon S3 PUT 抛出“SignatureDoesNotMatch”
【发布时间】:2013-06-10 00:29:22
【问题描述】:

这 AWS 安全问题让我抓狂。我正在尝试使用knox 从节点应用程序上传一些二进制文件。我的密钥/秘密组合不断收到臭名昭著的 SignatureDoesNotMatch 错误。我追溯到这个:例如传输,我可以通过连接s3.amazonaws.com访问bucket,但我不能通过虚拟子域mybucket.s3.amazonaws.com访问它。 (当我尝试使用 s3.amazonaws.com/mybucket 语法访问存储桶时,我收到一条错误消息,指出只允许使用子域样式。)

我已尝试将存储桶策略设置为明确允许来自相应用户的PUT,但这没有效果。谁能解释一下我如何能够从一个特定的 AWS 用户上传文件?

【问题讨论】:

  • S3 使用 HMAC 签名来验证请求。它将尝试重建签名服务器端以验证您是您所说的那个人。你是如何生成你的签名的?
  • 我没有手动执行此操作,但我怀疑这是问题所在:正如我所说,我可以使用 Transmit 很好地连接到“顶级”位置,因此显然 Transmit 会生成有效的签名。连接到s3.amazonaws.commyapp.s3.amazonaws.com 有什么区别?

标签: node.js amazon-web-services amazon-s3 knox-amazon-s3-client


【解决方案1】:

经过大量试验和错误后,我将其缩小到几个问题。我不完全确定哪一个最终修复了它,但您可能想尝试以下几点:

  • 确保您设置了正确的数据中心。就我而言,这看起来像这样:

    knox.createClient({
           key: this.config.key
      , secret: this.config.secret
      , bucket: this.config.bucket
      , region: 'us-west-2' // cause my bucket is supposed to be in oregon
    });
    
  • 检查您的 PUT 标头。在我的情况下,Content-Type 被意外设置为 undef,这导致了问题:

    var headers = {
        'x-amz-acl': 'public-read' // if you want anyone to be able to download the file
    };
    if (filesize) headers['Content-Length'] = filesize;
    if (mime) headers['Content-Type'] = mime;
    

【讨论】:

  • stackoverflow.com/questions/21452756/… 的解决方案存在类似问题。如果您没有将它们作为参数包含在 getSignedUrl 中,似乎 Content-Type 和 Content-Length 之类的标头通常会让您感到困惑。当客户端进行上传时,它们通常会将 Content-Type 和 Content-Length 包含在标头中(当有数据体时 HTTP 要求)......如果这些没有预先指定给 getSignedUrl 那么签名不匹配。
猜你喜欢
  • 2012-05-04
  • 2017-02-11
  • 2021-12-04
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2013-07-21
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多