【问题标题】:Upload to S3 via CloudFront results in 403通过 CloudFront 上传到 S3 结果为 403
【发布时间】:2016-03-12 06:56:00
【问题描述】:

我正在尝试签署一个 URL 以通过 CloudFront 上传到 S3。

  • S3 具有存储桶策略设置
  • CloudFront 正在使用自定义域/证书
  • CloudFront 配置为转发标头
  • GET 的签名 URL 工作正常

如果我使用策略签署 URL:

https://staging.*SNIP*.io/341-a25e82ef-8210-49bc-9fbd-b3f0c4807080-original.jpg?Policy=*SNIP*&Signature=*SNIP*&Key-Pair-Id=*SNIP*

或者没有策略但使用 Expires

https://staging.*SNIP*.io/343-aa3e9a57-4d85-4c90-bf05-3d6fdac04a49-original.jpg?Expires=1457765627&Signature=*SNIP*&Key-Pair-Id=*SNIP*

我一致得到:

<Error>
    <Code>AccessDenied</Code>
    <Message>Query-string authentication requires the Signature, Expires and AWSAccessKeyId parameters</Message>
    <RequestId>*snip*</RequestId>
    <HostId>*snip*</HostId>
</Error>

我根据各种不同的 SO 答案推出了自己的签名。我尝试使用 AWS SDK 的内置签名。我已经销毁并重新创建了 CloudFront 分配。

我已经完全没有想法可以尝试了。

我可能已经查看了关于 SO 上关于使用 cloudfront 签名的 URL 的每一个问题,但没有任何帮助。我无法克服这个 403 错误。

编辑: 似乎 AWS 不知道它为什么不工作,一切似乎都配置正确。

【问题讨论】:

    标签: c# amazon-cloudfront aws-sdk


    【解决方案1】:

    我设法弄明白了。文档(在撰写本文时)使我感到困惑。基本上:

    1) Cloudfront Distribution 需要设置为限制对存储桶的访问。 (如果不这样做,它似乎不会将 auth 标头传递给 S3)

    2) 散列有效载荷

    3) 签署 Cloudfront URL

    4) 签署请求

    为了散列我使用 Crypto.js(Core & SHA256)的负载

    var reader = new FileReader();
    
    reader.onload = function(readerEvt) {
        var binaryString = readerEvt.target.result;
        var wordArray = arrayBufferToWordArray(binaryString);
        var hash = CryptoJS.SHA256(wordArray);
    
        var hashedPayload = hash.toString(CryptoJS.enc.Hex);
    
        // send the hashed payload serverside for use in calculating the signed request
    };
    
    reader.readAsArrayBuffer(file);
    

    并签署我遵循的请求:

    http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html

    (如果您需要更多信息,请评论)

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 2015-09-08
      • 2017-11-21
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2012-05-17
      相关资源
      最近更新 更多