
我正在嘗試為從 S3 儲存桶提供的 CloudFront 發行版整合簽章 cookie,但收到存取被拒絕的錯誤訊息:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>BLAH BLAH</RequestId>
<HostId>BLAH BLAH</HostId>
</Error>
讓我困惑的是,有些文件似乎確實可以一致地工作,而我的自訂策略允許的同一目錄中的其他文件使用相同的簽名 cookie 時會失敗。
例如:我有一個文件位於/projects/index.html哪個有效且文件位於/projects/src/Runtime.js儘管使用了自訂策略,但該策略透過在資源中使用通配符來明確允許這兩種策略:http://test.mydomain.com/projects/*
這兩個檔案在 S3 上都設定為私有,我能想到這兩個檔案的請求方式之間的唯一區別是/projects/src/Runtime.js透過推薦人請求文件test.mydomain.com並不是mydomain.com這是第一個服務的/projects/index.html要求。
我知道 cookie 在兩個請求上都已正確設置,它們的自訂策略和簽名是有效的,因為當我亂搞它們並給它們錯誤的值時,我確實收到了不同的錯誤訊息。
無論如何!我的配置如下:
雲前設定:i.imgur.com/DMcUeDY.png(伺服器故障連結限制,啊)
我有一個備用主機名,它是提供檔案的網站的子網域(例如 test.mydomain.com)。它不是真正的 CNAME 條目,而且我沒有它的憑證 - 我透過本地 /etc/hosts 條目使用該名稱來引用 CloudFront。
CloudFront 起源設定:i.imgur.com/ereGJ42.png(伺服器故障連結限制,meh)
起源很簡單 - 引用我的 s3 儲存桶的根,並且我不限制該儲存桶,因為它還包含我想要保持公開可用的文件。
我修改了預設行為:i.imgur.com/5N2RlxM.png(伺服器故障連結限制,呃)
基本上打開了限制查看者訪問。受信任的簽署者是根帳戶,也是 s3 儲存桶的擁有者。
CloudFront 的其餘選項保持不變。我有一個由亞馬遜產生的 CloudFront 金鑰對,我將其與亞馬遜為 PHP 提供的程式碼片段(使用 openssl_sign)一起使用,以簽署可存取整個目錄的自訂策略。
由於非常模糊的「拒絕存取」錯誤訊息,我無法真正驗證問題出在哪裡,但我很確定它不是我簽署 cookie 的方式。我嘗試使用錯誤的值並收到不同的錯誤,例如“格式錯誤的簽名”或“格式錯誤的策略”,因此我假設我的簽名已通過檢查。另外,正如我所提到的,有些文件確實有效。
我已經被困在這個問題上幾天了,任何幫助將不勝感激!