如何對 CloudFront 中已簽署網址或已簽署 Cookie 相關問題進行疑難排解?

3 分的閱讀內容
0

我使用 Amazon CloudFront 和已簽署網址或已簽署 Cookie 來保護私人內容。我收到「403 存取遭拒」的錯誤。

解決方法

如果 Amazon CloudFront 遇到已簽署網址已簽署 Cookie相關問題,您可能會收到 403 存取遭拒錯誤。.

已簽署網址或已簽署 Cookie 未包含正確的簽署者

當您在一個行為中開啟限制檢視器存取權限時,您必須指定簽署者。簽署者是您在 CloudFront 中建立的可信金鑰群組,或是包含 CloudFront 金鑰配對的 AWS 帳戶。下列 403 錯誤訊息表示缺少簽署者資訊或資訊不正確:

錯誤包括訊息 "Missing Key-Pair-Id query parameter or cookie value."

此訊息表示已簽署網址缺少 Key-Pair-Id 查詢參數或參數為空白。或者,這表示已簽署 Cookie 缺少 CloudFront-Key-Pair-ID 查詢參數。

錯誤包括訊息 "Unknown Key."

此訊息表示 CloudFront 無法透過已簽署網址的 Key-Pair-ID 或已簽署 Cookie 的 CloudFront-Key-Pair-ID 驗證簽署者資訊。

若要解決此問題,請確認在已簽署網址中使用正確的 Key-Pair-ID 值,或在已簽署 Cookie 中使用正確的 CloudFront-Key-Pair-ID

若您使用已簽署的網址,請找出並記下 Key-Pair-ID 值。
-或-
若您使用已簽署的 Cookie,請找出並記下 CloudFront-Key-Pair-ID 值。

接著,找出金鑰 ID 並確認是否與 Key-Pair-IDCloudFront-Key-Pair-ID 相符:

  1. 開啟 CloudFront 主控台。在導覽功能表中,選擇分佈
  2. 選擇您的分佈。然後,選擇行為標籤。
  3. 選擇行為名稱,然後選擇編輯
  4. 找出限制檢視器存取權限設定。
    注意:如果設定為,則請求與此快取行為路徑模式相符的檔案必須使用已簽署網址或已簽署 Cookie。
  5. 檢查可信授權類型欄位。
  6. 可信授權類型值設定為可信金鑰群組,則請記下該可信金鑰群組的名稱。找出可信金鑰群組的公有金鑰 ID:
    開啟 CloudFront 主控台
    選擇金鑰群組。選擇您記下的可信金鑰群組名稱。
    確認 Key-Pair-IdCloudFront-Key-Pair-Id 值與可信金鑰群組中的其中一個公有金鑰 ID 相符。
  7. 可信授權類型為可信簽署者,則 CloudFront 會使用 AWS 產生的憑證。在此情況下,Key-Pair-IdCloudFront-Key-Pair-Id 值必須與 CloudFront 憑證的存取金鑰 ID 相符。
    注意:若要找出 CloudFront 憑證的存取金鑰 ID,請參閱 Creating key pairs for your signers

已簽署網址或已簽署 Cookie 未在有效時間內傳送

在您建立已簽署網址或已簽署 Cookie 後,JSON 格式的政策陳述式會指定該已簽署網址的限制。此陳述式會決定網址的有效時間。在下列情況下,CloudFront 會傳回 403 存取遭拒錯誤:

  • 使用標準政策時,已簽署網址的傳送時間大於已簽署網址中的 Expires 值。
  • 使用標準政策時,已簽署 Cookie 的傳送時間大於已簽署 Cookie 中的 CloudFront-Expires 值。
  • 使用自訂政策時,已簽署網址或已簽署 Cookie 的傳送時間大於 DateLessThan 值或小於 DateGreaterThan 值。

**注意:**ExpiresCloudFront-ExpiresDateLessThanDateGreaterThan 值均採用 Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC)。例如,2013 年 1 月 1 日上午 10:00 UTC 轉換成 Unix 時間格式會顯示為 1357034400。若您使用 Epoch 時間,請使用 32 位元的整數表示早於 2147483647 (2038 年 1 月 19 日 03:14:07 UTC) 的日期。

已簽署網址中的 Policy 參數或已簽署 Cookie 中的 CloudFront-Policy 屬性表示您使用自訂政策。政策陳述式為 JSON 格式,並使用 base64 編碼。若要找出 DateLessThanDateGreaterThan 值,請使用 64base 解碼命令。

Base64 編碼自訂政策範例:

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

若要將以 base64 編碼的自訂陳述式解碼為 JSON 格式,請執行下列 Linux 命令。.以您的自訂政策值取代政策值:

echo "eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__" | tr -- '-_~' '+=/' | base64 -d

您會收到類似下列訊息的輸出:

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

已簽署網址或已簽署 Cookie 在政策中擁有超過一個陳述式

若標準政策或自訂政策中包含超過一個陳述式,則 CloudFront 會傳回 403 存取遭拒錯誤。

若要疑難排解此問題,請執行上一節的 Linux 命令以檢查自訂政策陳述式。驗證您的程式碼詳細資訊,然後確認標準政策或自訂政策中只包含一個陳述式。

已簽署網址或已簽署 Cookie 在政策中擁有錯誤的基本網址

若政策中的基本網址不正確,CloudFront 會傳回 403 存取遭拒錯誤:

  • 資源金鑰中顯示為縮寫 (www.example.com)。使用完整網址 (http://www.example.com)。
  • 沒有 UTF-8 字元編碼。
  • 其中不包括所有標點符號和參數名稱。
  • HTTP 或 HTTPS 通訊協定與傳送已簽署網址或已簽署 Cookie 請求所使用的通訊協定不相符。
  • 網域名稱與使用者代理程式用於傳送已簽署網址或已簽署 Cookie 的主機標頭不相符。
  • 查詢字串包含無效字元。

已簽署網址或已簽署 Cookie 在政策中擁有錯誤的簽名

在下列情況下,CloudFront 會傳回 403 存取遭拒錯誤:

  • 政策陳述式包含空格,包括標籤和換行字元。
  • 標準政策或自訂政策未在雜湊前設定為字串格式。若您未使用 AWS SDK 建立已簽署網址或已簽署 Cookie 時,就會發生此情況。
  • 政策未在產生簽名之前進行雜湊。若您未使用 AWS SDK 建立已簽署網址或已簽署 Cookie 時,就會發生此情況。

如需使用已簽署網址或已簽署 Cookie 的簽名最佳實務,請參閱 Code examples for creating a signature for a signed URL

已簽署網址或已簽署 Cookie 從不支援的 IP 位址或 IP 範圍傳送

當已簽署網址或已簽署 Cookie 從 IPv6 位址傳送時,CloudFront 會傳回 403 存取遭拒錯誤,或是從自訂原則中不允許的 IPv4 位址或 IPv4 範圍傳送。

IpAddress 金鑰僅適用於已簽署網址或已簽署 Cookie 中的自訂政策。不支援 IPv6 格式的 IP 位址。若您使用包含 IpAddress 的自訂政策,則請勿開啟分佈的 IPv6。

已簽署 Cookie 未包含 Set-Cookie 回應標頭中的 Domain 和 Path 屬性

當 Cookie 從 CloudFront 傳回但不包含在相同網域之後的請求中時,CloudFront 會傳回 403 存取遭拒錯誤。如發生此情況,請檢查 Set-Cookie 回應標頭中的 DomainPath Cookie 屬性。

Domain 值是所請求檔案的網域名稱。如果您未指定 Domain 屬性,則預設值為網址中的網域名稱。這僅適用於指定的網域名稱,不適用於子網域。如果您指定 Domain 屬性,則該屬性也適用於子網域。

如果您指定 Domain 屬性,則網址中的網域名稱與 Domain 屬性的值必須相符。您可以指定 CloudFront 指派至您分佈中的網域名稱,例如 d111111abcdef8.cloudfront.net。不過,您無法將 *.cloudfront.net 指定為網域名稱。若要使用替代網域名稱 (例如 example.com),請在網址的分佈中新增替代網域名稱

Path 屬性是所請求檔案的路徑。如果您未指定 Path 屬性,則預設值為網址中的路徑。

AWS 官方
AWS 官方已更新 1 年前