带有签名URL的AWS CloudFront:403拒绝访问

时间:2017-05-04 17:39:36

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

我正在配置一个环境,其中 Amazon S3 Bucket 用于存储媒体文件, Amazon CloudFront 用于限制分发目的。

对这些媒体文件的访问权限必须是私密的,并且应通过签名的网址来完成。所以我在South America (São Paulo)区域创建了 S3 Bucket 并上传了一些测试文件。然后,我创建了一个 CloudFront分配,其前一个存储分区OriginBucket Access限制。我创建了一个新的 OAI (Origin Access Identity)并选择了Yes, Update Bucket Policy选项,以便自动配置 S3 Bucket Policies。 我只使用默认 Behavior,并使用HTTP and HTTPS 查看器协议政策GET, HEAD 允许的方法配置< / strong>即可。已设置Restrict Viewer Access (Use Signed URLs or Signed Cookies)Trusted Signer设置为Self

以下是一些澄清设置的图片:

S3 Bucket Policy S3 Bucket Policy

分布的起源 Distribution's Origin

分布行为 Distribution's Behavior

我在尝试访问使用 awscli cfsign.pl 生成的签名网址时收到HTTP 403

<Error>
    <Code>AccessDenied</Code>
    <Message>Access denied</Message>
</Error>

有什么遗漏我不知道吗?看起来我做了 docs 所说的一切。

4 个答案:

答案 0 :(得分:1)

重新创建 Amazon S3 Bucket Amazon CloudFront Distribution 后,我仍然遇到此问题。与我的橡皮鸭会话后,我发现我使用的Private Key文件属于已删除的CloudFront Key-pair

现在我正在使用正确的密钥来加密一切正常。这并不能解释为什么第一个存储桶分发无法正常工作,因为在特定情况下我使用的是相同配置和正确的Private Key文件。

答案 1 :(得分:1)

我也遇到了同样的问题。可能,我们必须重新生成Clouf Front密钥对。

答案 2 :(得分:1)

我收到了同样的Access Denied错误,并在最后几个小时试图弄清楚发生了什么。我终于意识到,由于我使用的是本地时间而不是UTC,因此过去设置了Expires参数。请务必根据UTC设置Expires

答案 3 :(得分:0)

就我而言,问题出在URL上,我正在传递给URL签名代码(我正在使用用于Node.js的AWS开发工具包)。

cloudFront.getSignedUrl({
  url: `${distributionUrl}/${encodeURI(key)}`,
  expires: Math.floor(new Date().getTime() / 1000) + 60 * 60
})

请注意encodeURI。我没有那样做。生成的签名URL仍将具有URI组件编码, BUT将具有无效签名,从而导致403错误。

编辑:...并且您必须像这样将其包装到url.format()中:

cloudFront.getSignedUrl({
  url: url.format(`${distributionUrl}/${encodeURI(key)}`),
  expires: Math.floor(new Date().getTime() / 1000) + 60 * 60
})

我想他们应该在SDK中做到这一点。