![具有受限访问的 AWS Cloudfront 缺少密钥和无效密钥 403 错误](https://linux22.com/image/1601743/%E5%85%B7%E6%9C%89%E5%8F%97%E9%99%90%E8%AE%BF%E9%97%AE%E7%9A%84%20AWS%20Cloudfront%20%E7%BC%BA%E5%B0%91%E5%AF%86%E9%92%A5%E5%92%8C%E6%97%A0%E6%95%88%E5%AF%86%E9%92%A5%20403%20%E9%94%99%E8%AF%AF.png)
我正在开发一个 PoC,用于限制对 Web 应用程序中某些文件的访问。基本上,一个用户应该有权访问 S3 中的所有文件,而另一个用户只能访问公共文件(未登录的用户也可以访问)。
我设置了一个带有一个private-files
文件夹和一个public-files
文件夹的 S3 存储桶,并设置了一个存储桶策略,以将对公共文件的访问限制到一个 cloudfront arn,将对私有文件的访问限制到另一个 cloudfront arn。在任一 cloudfront 发行版上均未启用文件限制的情况下进行测试,结果表明它按预期运行。
然后,我通过私有云端分发限制对文件的访问,将签名者限制为“自己”,并根据我的安全凭证生成云端密钥对。
我在用着这个脚本基本上是开箱即用的,只需进行少量修改(例如间距和删除一些转换)即可使解释器正常工作。它可以毫无问题地生成 cookie。
当我尝试通过 cloudfront url 访问私人文件时,收到以下消息:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MissingKey</Code>
<Message>Missing Key-Pair-Id query parameter or cookie value</Message>
</Error>
Postman 说它带有 403 禁止状态。当我将 CloudFront-Signature、CloudFront-Key-Pair-Id、CloudFront-Policy 添加到 Postman 中的 cookie 中时,我得到了
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidKey</Code>
<Message>Unknown Key</Message>
</Error>
再次出现 403。CloudFront-Key-Pair-Id 似乎是导致这种情况发生的 cookie,因为其他两个仅返回缺少的密钥,而这个本身返回了无效的密钥消息。
除了这些 cookie 之外,我还需要发送什么吗?根据我上面描述的设置,这些是预期的错误消息吗?还是我缺少一些需要发送的数据?或者可能是其他问题?
答案1
缺少密钥和无效密钥指的是 AWS CloudFront 密钥对 ID,而不是 S3 对象密钥。如果您不发送该值,您将收到缺少密钥的响应。如果您发送该值并且它是错误的,您将收到无效密钥。
登录您的 aws 账户,单击右上角的账户名,然后选择我的安全凭证。展开 cloudfront 访问密钥部分并从那里复制密钥对 ID。
答案2
我能够通过以下步骤解决该问题:
- 转到 cloudfront 发行版
- 点击“行为”选项卡
- 选中复选框并单击“编辑”
- 在“受信任密钥组”或“受信任签名者”单选按钮中选择“受信任签名者”
- 点击“保存”
https://www.lazydeveloper.tech/aws/aws-cloudfront-invalidkey-unknown-key-when-using-signed-urls/