带有签名 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,之前的 bucketOrigin,它的 Bucket Accessrestricted。我创建了一个新的 OAI(原始访问身份)并选择了选项 Yes, Update Bucket Policy 以便它自动配置 S3 Bucket Policies。 我只使用 default Behavior 并配置了 HTTP and HTTPS viewer protocol policyGET, HEAD allowed methodsRestrict Viewer Access (Use Signed URLs or Signed Cookies) 已设置,Trusted Signer 设置为 Self

这里有一些图片来说明设置:

S3 存储桶政策

发行来源

分发行为

我在尝试访问使用 awsclicfsign.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 BucketAmazon CloudFront Distribution 后,我仍然遇到此问题。在与我的橡皮鸭会话后,我发现我正在使用的 Private Key 文件属于已删除的 CloudFront Key-pair

现在我使用了正确的密钥来加密一切,一切正常。这并不能解释为什么第一个 bucketdistribution 不起作用,因为在那种特定情况下,我使用的是 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

AWS CloudFront 签名 URL 的访问被拒绝

Amazon S3 无法通过 Cloudfront 上传文件

Amazon Cloudfront 签名 URL 访问被拒绝问题