我正在尝试集成由 S3 存储桶提供的 CloudFront 分发的签名 cookie,但收到访问被拒绝错误消息:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>BLAH BLAH</RequestId>
<HostId>BLAH BLAH</HostId>
</Error>
令我困惑的是,有些文件似乎能始终如一地工作,而我自定义策略允许的同一目录中的其他文件使用相同的签名 cookie 却失败了。
例如:我有一个文件/项目/index.html哪个有效,并且文件/项目/src/Runtime.js尽管使用了自定义策略,通过在资源中使用通配符明确允许它们两者,但事实并非如此:http://test.mydomain.com/projects/*
这两个文件在 S3 上都设置为私有,我能想到的这两个文件请求方式之间的唯一区别是/项目/src/Runtime.js请求的文件带有引用测试.mydomain.com并不是我的域名这是第一个/项目/index.html要求。
我知道两个请求上的 cookie 都设置正确,并且它们的自定义策略和签名是有效的,因为当我弄乱它们并赋予它们错误的值时,我确实会收到不同的错误消息。
无论如何!我的配置如下:
CloudFront 设置:i.imgur.com/DMcUeDY.png(Serverfault 链接限制,呸)
我有一个备用主机名,它是提供文件服务的站点的子域(例如 test.mydomain.com)。它不是真正的 CNAME 条目,我也没有它的证书 - 我通过本地 /etc/hosts 条目使用该名称引用 CloudFront。
CloudFront Origin 设置:i.imgur.com/ereGJ42.png(Serverfault 链接限制,嗯)
来源很简单 - 引用我的 s3 存储桶的根目录,并且我不限制存储桶,因为它还包含我想要保持公开的文件。
我修改了默认行为:i.imgur.com/5N2RlxM.png(Serverfault 链接限制,呃)
基本上打开了“限制查看者访问”。受信任的签名者是 root 帐户,它也是 s3 存储桶的所有者。
其余的 CloudFront 选项保持不变。我有一个由亚马逊生成的 CloudFront 密钥对,我将其与亚马逊为 PHP 提供的代码片段(使用 openssl_sign)一起使用,以签署授予对整个目录访问权限的自定义策略。
由于“拒绝访问”错误消息非常模糊,我无法真正验证问题出在哪里,但我很确定问题不在我签署 Cookie 的方式上。我尝试使用错误的值,并得到了不同的错误,如“签名格式错误”或“策略格式错误”,所以我假设我的签名检查通过。此外,正如我提到的,有些文件确实有效。
我已经为此困扰了好几天了,任何帮助都将不胜感激!