署名付き Cookie を使用した CloudFront + S3 アクセスが拒否されました

署名付き Cookie を使用した CloudFront + S3 アクセスが拒否されました

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/プロジェクト/*

どちらのファイルもS3上で非公開に設定されていますが、この2つのファイルのリクエスト方法の違いは、/プロジェクト/src/Runtime.jsファイルはリファラーで要求されますtest.mydomain.comそしてそうではないマイドメインそれが最初に役立った/プロジェクト/index.htmlリクエスト。

両方のリクエストで Cookie が適切に設定されており、それらのカスタム ポリシーと署名が有効であることはわかっています。なぜなら、それらをいじって間違った値を指定すると、異なるエラー メッセージが表示されるからです。

とにかく! 私の設定は次のとおりです:
CloudFront 設定:i.imgur.com/DMcUeDY.png(Serverfault リンクの制限、ばか)
ファイルを提供しているサイトのサブドメインである代替ホスト名があります (たとえば、test.mydomain.com)。これは実際の CNAME エントリではなく、証明書もありません。ローカルの /etc/hosts エントリを介してその名前を使用して CloudFront を参照しています。

CloudFront オリジン設定:翻訳:(Serverfault リンクの制限、まあ)
origin は単純です - 私の s3 バケットのルートを参照します。また、バケットには公開したままにしておきたいファイルも含まれているため、バケットを制限しません。

デフォルトの動作を変更しました:i.imgur.com/5N2RlxM.png(Serverfault リンクの制限、うーん)
基本的に、閲覧者アクセスの制限をオンにしました。信頼できる署名者は、s3 バケットの所有者でもあるルート アカウントです。

残りの CloudFront オプションは変更されていません。Amazon によって生成された CloudFront キーペアがあり、Amazon が PHP 用に提供したスニペット (openssl_sign を使用) とともに使用して、ディレクトリ全体へのアクセスを許可するカスタム ポリシーに署名しています。

非常に曖昧な「アクセスが拒否されました」というエラー メッセージのため、問題がどこにあるのかを実際に確認することはできませんが、Cookie に署名する方法に問題があるわけではないことはほぼ確実です。間違った値を使用して、「署名の形式が正しくありません」や「ポリシーの形式が正しくありません」などのさまざまなエラーが発生したため、署名はチェックされていると想定しています。また、前述したように、一部のファイルは機能します。

ここ数日間、この問題で行き詰まっています。どんな助けでもいただければ幸いです。

関連情報