带有签名 URL 的 AWS CloudFront:403 访问被拒绝
Posted
技术标签:
【中文标题】带有签名 URL 的 AWS CloudFront:403 访问被拒绝【英文标题】:AWS CloudFront with Signed URL: 403 Access Denied 【发布时间】:2017-10-03 00:31:24 【问题描述】:我正在配置一个带有 Amazon S3 存储桶 用于存储媒体文件和 Amazon CloudFront 用于受限分发目的的环境。
对这些媒体文件的访问必须是私密的,并且应该通过签名的 URL 完成。所以我在South America (São Paulo)
区域创建了 S3 Bucket 并上传了一些测试文件。然后我创建了一个 CloudFront Distribution,之前的 bucket 为 Origin
,它的 Bucket Access
是 restricted。我创建了一个新的 OAI(原始访问身份)并选择了选项 Yes, Update Bucket Policy
以便它自动配置 S3 Bucket Policies
。
我只使用 default Behavior
并配置了 HTTP and HTTPS
viewer protocol policy 和 GET, HEAD
allowed methods。 Restrict Viewer Access (Use Signed URLs or Signed Cookies)
已设置,Trusted Signer
设置为 Self
。
这里有一些图片来说明设置:
S3 存储桶政策
发行来源
分发行为
我在尝试访问使用 awscli 或 cfsign.pl
生成的签名 URL 时收到HTTP 403
<Error>
<Code>AccessDenied</Code>
<Message>Access denied</Message>
</Error>
是否缺少一些我不知道的东西? docs 所说的一切都是我完成的。
【问题讨论】:
【参考方案1】:我收到了同样的Access Denied
错误,并在最后几个小时试图弄清楚发生了什么。我终于意识到 Expires
参数是在过去设置的,因为我使用的是本地时间而不是 UTC。确保将来根据UTC设置Expires
。
【讨论】:
【参考方案2】:在我的情况下,问题在于我传递给 URL 签名代码的 URL(我使用的是 AWS SDK for Node.js)。
cloudFront.getSignedUrl(
url: `$distributionUrl/$encodeURI(key)`,
expires: Math.floor(new Date().getTime() / 1000) + 60 * 60
)
注意encodeURI
。我没有那样做。生成的签名 URL 仍会包含 URI 组件编码,但签名无效,从而导致 403 错误。
编辑:...您必须像这样将其包装到 url.format()
中:
cloudFront.getSignedUrl(
url: url.format(`$distributionUrl/$encodeURI(key)`),
expires: Math.floor(new Date().getTime() / 1000) + 60 * 60
)
我猜他们应该在 SDK 中这样做。
【讨论】:
非常感谢!这个已经掉了几根头发了,哈哈【参考方案3】:重新创建 Amazon S3 Bucket 和 Amazon CloudFront Distribution 后,我仍然遇到此问题。在与我的橡皮鸭会话后,我发现我正在使用的 Private Key
文件属于已删除的 CloudFront Key-pair
。
现在我使用了正确的密钥来加密一切,一切正常。这并不能解释为什么第一个 bucket 和 distribution 不起作用,因为在那种特定情况下,我使用的是 same 配置集和正确的Private Key
文件。
【讨论】:
【参考方案4】:我也遇到了同样的问题。可能,我们必须重新生成 Clouf Front 密钥对。
【讨论】:
我不知道。但实际上,重新生成密钥后,问题已经解决了。【参考方案5】:我遇到了同样的问题,我为解决这个问题而执行的步骤是:
在Distribution Settings
内,将Default Root Object
设置为index.html
。
从Error pages
选项卡单击Create Custom Error Response
并为Http 错误代码404 添加一个错误,响应页面路径设置为/index.html
【讨论】:
以上是关于带有签名 URL 的 AWS CloudFront:403 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
通过 AWS 开发工具包创建签名的 S3 和 Cloudfront URL
带有签名 cookie 的 AWS Cloudfront POST 请求
使用 Java AWS 开发工具包的 Cloudfront 限时(签名)URL