我正在配置一个环境,其中 Amazon S3 Bucket 用于存储媒体文件, Amazon CloudFront 用于限制分发目的。
对这些媒体文件的访问权限必须是私密的,并且应通过签名的网址来完成。所以我在South America (São Paulo)
区域创建了 S3 Bucket 并上传了一些测试文件。然后,我创建了一个 CloudFront分配,其前一个存储分区为Origin
,Bucket 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
。
以下是一些澄清设置的图片:
我在尝试访问使用 awscli 或 cfsign.pl 生成的签名网址时收到HTTP 403
<Error>
<Code>AccessDenied</Code>
<Message>Access denied</Message>
</Error>
有什么遗漏我不知道吗?看起来我做了 docs 所说的一切。
答案 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中做到这一点。