【问题标题】:AWS CloudFront with Signed URL: 403 Access Denied带有签名 URL 的 AWS CloudFront:403 访问被拒绝
【发布时间】: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 所说的一切都是我完成的。

【问题讨论】:

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


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2019-08-30
          • 2018-01-16
          • 2021-09-07
          • 2018-09-18
          • 2013-01-03
          • 2015-05-21
          • 1970-01-01
          • 2015-02-13
          • 2019-01-24
          相关资源
          最近更新 更多