通过CloudFront上传到S3会产生403

时间:2016-03-12 06:56:00

标签: c# amazon-cloudfront aws-sdk

我正在尝试通过CloudFront签署一个上传到S3的网址。

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

如果我使用政策签署网址:

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

或没有政策但使用过期

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签名的网址的所有问题,但没有任何帮助。我无法理解403错误。

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

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。文档(在撰写本文时)使我感到困惑。基本上是:

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

2)散列有效载荷

3)签署Cloudfront URL

4)签署请求

要使用Crypto.js(Core&amp; 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

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