本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用自訂政策設定已簽章的 Cookie
若要設定使用標準政策的已簽署 Cookie,請完成以下步驟。
使用自訂政策設定已簽章的 Cookie
-
如果您使用 .NET 或 Java 建立簽章的 URL,並且您還沒有將金鑰對的私有金鑰從預設的 .pem 格式重新格式化為與 .NET 或 Java 相容的格式,則現在執行此操作。如需詳細資訊,請參閱 重新格式化私有金鑰 (僅限 .NET 和 Java)。
-
請編寫您的應用程式以發送三個
Set-Cookie
標頭給已核准的瀏覽者。您需要三個Set-Cookie
標頭,因為每個Set-Cookie
標頭只能包含一個名稱值組,而 CloudFront 已簽署的 Cookie 需要三個名稱值組。名稱值組是:CloudFront-Policy
、CloudFront-Signature
和CloudFront-Key-Pair-Id
。在使用者對要控制存取的檔案發出第一次請求之前,這些值必須出現在檢視器。注意
一般而言,建議您排除
Expires
和Max-Age
屬性。這會導致瀏覽器在使用者關閉瀏覽器時刪除 Cookie,從而降低有人未經授權存取您的內容的可能性。如需詳細資訊,請參閱 防止濫用已簽章的 Cookie。Cookie 屬性的名稱區分大小寫。
只包含分行符號,以使屬性更易讀。
Set-Cookie: CloudFront-Policy=
base64 encoded version of the policy statement
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Signature=hashed and signed version of the policy statement
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly- (選用)
Domain
-
請求檔案的網域名稱。如果不指定
Domain
屬性,則預設值是 URL 中的網域名稱,並且它僅適用於指定的網域名稱,而不適用於子網域名稱。如果指定Domain
屬性,它也適用於子網域名稱。網域名稱中的前導點 (例如Domain=.example.com
) 是可選的。此外,如果指定Domain
屬性,則 URL 中的網域名稱和Domain
屬性的值必須相符。您可以指定 CloudFront 指派給您的分佈的網域名稱,例如,d111111abcdef8.cloudfront.net,但不能為網域名稱指定 *.cloudfront.net。
如果要在 URL 中使用備用網域名稱 (如 example.com),則無論您是否指定了
Domain
屬性,都必須將備用網域名稱新增到分佈中。如需詳細資訊,請參閱 所有分佈設定參考 主題中的 備用網域名稱 (CNAME)。 - (選用)
Path
-
請求檔案的路徑。如果未指定
Path
屬性,則預設值為 URL 中的路徑。 Secure
-
在檢視器傳送請求之前,需要對 Cookie 進行加密。我們建議您透過 HTTPS 連線發送
Set-Cookie
標頭,以確保 Cookie 屬性免受中間人攻擊。 HttpOnly
-
要求檢視器僅在 HTTP 或 HTTPS 請求中傳送 Cookie。
CloudFront-Policy
-
JSON 格式的政策陳述式,移除空格,然後移除 base64 編碼。如需詳細資訊,請參閱為使用自訂政策的已簽章 Cookie 建立簽章。
政策陳述式可控制已簽署 Cookie 授予使用者的存取權限。它包括使用者可以存取的檔案、到期日期和時間、URL 變成有效的選擇性日期和時間,以及允許存取檔案的選用 IP 地址或 IP 地址範圍。
CloudFront-Signature
-
JSON 政策聲明的雜湊、簽章和 base64-encoded 版本。如需詳細資訊,請參閱 為使用自訂政策的已簽章 Cookie 建立簽章。
CloudFront-Key-Pair-Id
-
CloudFront 公有金鑰的 ID,例如
K2JCJMDEHXQW5F
。公有金鑰 ID 會告訴 CloudFront 要使用哪個公有金鑰來驗證已簽署的 URL。CloudFront 將簽章中的資訊與政策聲明中的資訊進行比較,以驗證該 URL 尚未遭到篡改。此公有金鑰必須屬於分佈中信任的簽署者金鑰群組。如需詳細資訊,請參閱指定可以建立已簽署 URLs簽署者。
- (選用)
自訂政策的範例Set-Cookie
標頭
請參閱下列Set-Cookie
標頭對的範例。
如果您想要在 URLs 中使用替代網域名稱,例如 example.org,無論您是否指定 Domain
屬性,都必須將替代網域名稱新增至您的分佈。如需詳細資訊,請參閱 所有分佈設定參考 主題中的 備用網域名稱 (CNAME)。
範例 1
當您在檔案的 URLs 中使用與分佈相關聯的網域名稱時,您可以將 Set-Cookie
標頭用於一個已簽章的 Cookie。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
範例 2
當您在檔案的 URL 中使用替代網域名稱 (example.org://) 時,您可以將Set-Cookie
標頭用於一個已簽章的 Cookie。 URLs
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
範例 3
當您在檔案的 URLs的Set-Cookie
標頭對。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
範例 4
當您使用與檔案 URLs 中的分佈相關聯的替代網域名稱 (example.org://) 時,您可以將Set-Cookie
標頭對用於一個已簽章的請求。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
為使用自訂政策的已簽章 Cookie 建立政策陳述式
若要為自訂政策建立政策陳述式,請執行以下步驟。如需以各種方式控制對檔案存取的幾個政策聲明範例,請參閱 使用自訂政策的已簽署 Cookie 範例政策陳述式。
為使用自訂政策的簽章的 Cookie 建立政策聲明
-
使用下列 JSON 格式建構政策聲明。
{ "Statement": [ { "Resource": "URL of the file", "Condition": { "DateLessThan": { "AWS:EpochTime":required ending date and time in Unix time format and UTC }, "DateGreaterThan": { "AWS:EpochTime":optional beginning date and time in Unix time format and UTC }, "IpAddress": { "AWS:SourceIp": "optional IP address" } } } ] }
注意下列事項:
-
您只能包含一個聲明。
-
使用 UTF-8 字元編碼。
-
完全按照規定包含所有標點符號和參數名稱。不接受參數名稱的縮寫。
-
Condition
部分的參數順序不重要。 -
如需有關
Resource
、DateLessThan
、DateGreaterThan
和IpAddress
值的詳細資訊,請參閱 您在政策陳述式中為已簽章 Cookie 的自訂政策指定的值。
-
-
從政策陳述式中移除所有空格 (包括標籤和換行字元)。您可能必須在應用程式的程式碼的字串中包含逸出字元。
-
使用 MIME base64 編碼 Base64-encode 政策聲明。如需詳細資訊,請參閱 RFC 2045,MIME (多用途網際網路郵件延伸) 第一部分:網際網路訊息內文的格式中的第 6.8 節:Base64 Content-Transfer-Encoding
。 -
將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。
取代這些無效的字元 有了這些有效的字元 +
- (連字號)
=
_ (底線)
/
~ (波狀符號)
-
將結果值包含在您的
Set-Cookie
標頭後的CloudFront-Policy=
。 -
透過進行雜湊、簽章和 base64 編碼政策聲明來為
Set-Cookie
建立CloudFront-Signature
標頭的簽章。如需詳細資訊,請參閱 為使用自訂政策的已簽章 Cookie 建立簽章。
您在政策陳述式中為已簽章 Cookie 的自訂政策指定的值
當您為自訂政策建立政策聲明時,您可以指定以下值。
- 資源
-
包含查詢字串的基本 URL (如果有):
https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes
重要
如果省略
Resource
參數,則使用者可以存取與用於建立已簽章的 URL 的金鑰對相關聯的任何分佈的所有檔案。您只能為
Resource
指定一個值。注意下列事項:
-
通訊協定 – 此值必須以
http://
或https://
開頭。 -
查詢字串參數 – 如果沒有查詢字串參數,請省略問號。
-
萬用字元 – 可以使用比對零或多個字元 (*) 的萬用字元,或比對字串中任意位置單一字元 (?) 的萬用字元。例如,值為:
https://d111111abcdef8.cloudfront.net/*game_download.zip*
將包括 (例如) 下列檔案:
-
https://d111111abcdef8.cloudfront.net/game_download.zip
-
https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes
-
https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp
-
-
替代網域名稱 – 如果在 URL 中指定了替代網域名稱 (CNAME),則在引用網頁或應用程式中的檔案時,必須指定替代網域名稱。請勿為檔案指定 Amazon S3 URL。
-
- DateLessThan
-
Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 的 URL 的到期日期和時間。不要將值括在引號中。
例如,2015 年 3 月 16 日上午 10:00 UTC 以 Unix 時間格式轉換為 1426500000。
如需詳細資訊,請參閱 當 CloudFront 檢查已簽章 Cookie 中的過期日期和時間時。
- DateGreaterThan (選用)
-
Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 的 URL 的選用日期和時間。不允許使用者在指定的日期和時間當天或之前存取檔案。不要將值括在引號中。
- IpAddress (選用)
-
提出 GET 請求的用戶端 IP 地址。注意下列事項:
-
要允許任何 IP 位址存取該檔案,請省略
IpAddress
參數。 -
您可以指定一個 IP 地址或一個 IP 地址範圍。例如,如果用戶端的 IP 位址位於兩個不同的範圍之一,則無法設定政策以允許存取。
-
若要允許從單一 IP 地址存取,您需要指定:
"
IPv4 IP 地址
/32"
-
必須以標準 IPv4 CIDR 格式指定 IP 地址範圍 (例如
192.0.2.0/24
)。如需詳細資訊,請前往 RFC 4632,無類別網域間路由選擇 (CIDR):網際網路地址指派和彙總計劃,https://tools.ietf.org/html/rfc4632。 重要
不支援 IPv6 格式的 IP 地址,例如 2001:0db8:85a3::8a2e:0370:7334。
如果您使用的是包括
IpAddress
的自訂政策,請不要為分佈啟用 IPv6。如果您希望透過 IP 地址限制對某些內容的存取,並支援對其他內容的 IPv6 請求,則可以建立兩個分佈。如需詳細資訊,請參閱 所有分佈設定參考 主題中的 啟用 IPv6。
-
使用自訂政策的已簽署 Cookie 範例政策陳述式
以下範例說明政策聲明說明了如何控制對特定檔案的存取、目錄中的所有檔案,或與金鑰對 ID 相關聯的所有檔案。此範例還會說明如何控制來自個別的 IP 地址或各種 IP 地址的存取,以及如何防止使用者在指定的日期和時間之後使用已簽章的 Cookie。
如果您複製並貼上任何這些範例,請移除任何空格 (包括標籤和換行字元)、將值取代為您自己的值,並在關閉拉條 ( } ) 後包含換行字元。
如需詳細資訊,請參閱您在政策陳述式中為已簽章 Cookie 的自訂政策指定的值。
範例政策陳述式:從 IP 地址範圍存取一個檔案
以下範例自訂政策在已簽署的 Cookie 中,其指定使用者在 2023 年 1 月 1 日上午 10:00 (UTC) 之前,可以從 192.0.2.0/24
範圍內的 IP 地址存取檔案 https://d111111abcdef8.cloudfront.net/game_download.zip
:
{ "Statement": [ { "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1357034400 } } } ] }
範例政策陳述式:從一系列 IP 地址存取目錄中的所有檔案
以下範例自訂政策允許您為 training
目錄中的任何檔案建立已簽章的 Cookie,如 Resource
參數中的 * 萬用字元所示。使用者在到 UTC 2013 年 1 月 1 日上午 10:00 之前可以從 192.0.2.0/24
範圍內的 IP 位址存取該檔案:
{ "Statement": [ { "Resource": "https://d111111abcdef8.cloudfront.net/training/*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1357034400 } } } ] }
您使用此政策的每個已簽章的 Cookie 都包括一個識別特定的檔案的基本 URL,例如:
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
範例政策陳述式:從一個 IP 地址存取與金鑰對 ID 相關聯的所有檔案
以下範例自訂政策允許您為與任何分佈關聯的任何檔案設定已簽章的 Cookie,如 Resource
參數中的 * 萬用字元所示。使用者必須使用 IP 地址 192.0.2.10/32
。(CIDR 表示法中的 192.0.2.10/32
值是指單個 IP 地址 192.0.2.10
。) 這些檔案只能在 2013 年 1 月 1 日上午 10:00 UTC 至 2013 年 1 月 2 日上午 10:00 UTC 之間可用:
{ "Statement": [ { "Resource": "https://*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.10/32" }, "DateGreaterThan": { "AWS:EpochTime": 1357034400 }, "DateLessThan": { "AWS:EpochTime": 1357120800 } } } ] }
您使用此政策的每個已簽署的 Cookie 都包括一個基本 URL,用於識別特定 CloudFront 分佈中的特定檔案,例如:
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
該已簽署 Cookie 還包括金鑰對 ID,必須與在基本 URL 中指定的分佈 (d111111abcdef8.cloudfront.net) 內信任的簽署者相關聯。
為使用自訂政策的已簽章 Cookie 建立簽章
使用自訂政策的已簽章的 Cookie 的簽章是政策聲明的雜湊、簽章和 base64-encoded 版本。
如需有關如何對政策聲明進行雜湊、簽章和編碼的詳細資訊和範例,請參閱:
使用自訂政策為已簽章的 Cookie 建立簽章
-
使用 SHA-1 雜湊函數和 RSA 對您在為使用自訂政策的已簽章的 URL 建立政策聲明程序中建立的 JSON 政策聲明進行雜湊和簽署。使用不再包含空格但尚未以 base64 編碼的政策陳述式版本。
對於雜湊函數所需的私有金鑰,使用其公有金鑰在活動的信任金鑰組中的私有金鑰進行分佈。
注意
用於雜湊和簽名政策聲明的方法取決於您的程式設計語言和平台。如需程式碼範例,請參閱 為已簽署 URL 建立簽章的程式碼範例。
-
從雜湊和簽章字串中移除空格 (包括標籤和換行字元)。
-
使用 MIME base64 編碼的 Base64-encode 字串。如需詳細資訊,請參閱 RFC 2045,MIME (多用途網際網路郵件延伸) 第一部分:網際網路訊息內文的格式中的第 6.8 節:Base64 Content-Transfer-Encoding
。 -
將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。
取代這些無效的字元 有了這些有效的字元 +
- (連字號)
=
_ (底線)
/
~ (波狀符號)
-
將結果值包含在
Set-Cookie
名稱值組的CloudFront-Signature=
標頭中,並返回到 使用自訂政策設定已簽章的 Cookie 為Set-Cookie
新增CloudFront-Key-Pair-Id
標頭。