使用自訂政策建立已簽署 URL - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用自訂政策建立已簽署 URL

若要使用自訂政策建立簽章的 URL,請執行以下程序。

使用自訂政策建立簽章的 URL
  1. 如果您使用 .NET 或 Java 建立簽章的 URL,並且您還沒有將金鑰對的私有金鑰從預設的 .pem 格式重新格式化為與 .NET 或 Java 相容的格式,則現在執行此操作。如需詳細資訊,請參閱 重新格式化私有金鑰 (僅限 .NET 和 Java)

  2. 以指定的順序串連以下值,並刪除各部分之間的空格 (包括標籤和新行字元)。您可能必須在應用程式的程式碼的字串中包含逸出字元。所有值都有一個字串類型。每個部分都按編號 ( 1 ) 輸入下列兩個範例。

    1 檔案的基本 URL

    如果您沒有使用已簽署的 CloudFront URL (包括您自己的查詢字串參數 (如果有的話),則基本 URL 是用來存取檔案的 URL。如需有關分佈的 URL 格式的詳細資訊,請參閱 自訂中檔案的 URL 格式 CloudFront

    以下範例說明您為分佈指定的值。

    • 下列 CloudFront URL 適用於發行版中的影像檔案 (使用 CloudFront 網域名稱)。請注意,image.jpg 位於 images 目錄中。在 URL 中檔案的路徑必須與 HTTP 伺服器或 Amazon S3 儲存貯體中的檔案的路徑相符。

      https://d111111abcdef8.cloudfront.net/images/image.jpg

    • 下列 CloudFront URL 包含查詢字串:

      https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large

    • 下列 CloudFront URL 適用於發行版中的影像檔案。兩種都使用備用網域名稱,第二個包含查詢字串:

      https://www.example.com/images/image.jpg

      https://www.example.com/images/image.jpg?color=red

    • 以下 CloudFront URL 適用於發行版中使用替代網域名稱和 HTTPS 通訊協定的映像檔:

      https://www.example.com/images/image.jpg

    2 ?

    ? 代表基本 URL 後面所接的查詢字串參數。即使您沒有自己的查詢字串參數,也請包含 ?

    3 您的查詢字串參數 (如果有的話)&

    此值是選用的。如果您希望新增自己的查詢字串參數,例如:

    color=red&size=medium

    接著,請在 ? 之後 (請參閱 2 ) 和 Policy 參數之前加入。在極少數情況下,您可能需要將查詢字串參數放在 Key-Pair-Id 之後。

    重要

    您的參數不能被命名為 PolicySignatureKey-Pair-Id

    如果加入自己的參數,請在每個參數的後面附加一個 &,包括最後一個參數。

    4 Policy=政策陳述式的 base64 編碼版本

    您的政策聲明採用 JSON 格式,刪除了空格,然後使用 base64 編碼。如需詳細資訊,請參閱 為使用自訂政策的已簽署 URL 建立政策陳述式

    政策陳述式可控制簽署的 URL 授予使用者的存取權限。它包括檔案的 URL、到期日期和時間、URL 變成有效的選擇性日期和時間,以及允許存取檔案的選用 IP 地址或 IP 地址範圍。

    5 &Signature=政策陳述式經過雜湊與簽章的版本

    JSON 政策聲明的雜湊、簽章和 base64-encoded 版本。如需詳細資訊,請參閱 為使用自訂準政策的已簽署 URL 建立簽章

    6 &Key-Pair-Id=公開金鑰的CloudFront 公開金鑰 ID,其對應私密金鑰用來產生簽章

    CloudFront 公開金鑰的識別碼,例如K2JCJMDEHXQW5F。公開金鑰 ID 會告訴要使用 CloudFront 哪個公開金鑰來驗證已簽署的 URL。 CloudFront 將簽章中的資訊與原則陳述式中的資訊進行比較,以確認 URL 未遭竄改。

    此公有金鑰必須屬於分佈中信任的簽署者金鑰群組。如需詳細資訊,請參閱 指定可以建立已簽署 URL 和已簽署 Cookie 的簽署者

已簽署 URL 的範例:

1 https://d111111abcdef8.cloudfront.net/image.jpg 2 ? 3 color=red&size=medium& 4 Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA 6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ 29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiI yMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQ VdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp 7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo 5 &Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~ -ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmat EXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6 6 &Key-Pair-Id=K2JCJMDEHXQW5F

為使用自訂政策的已簽署 URL 建立政策陳述式

請完成以下步驟,以為使用自訂政策之簽署的 URL 建立政策陳述式。

如需以各種方式控制對檔案存取的政策聲明範例,請參閱 使用自訂政策的已簽署 URL 範例政策陳述式

為使用自訂政策的已簽章的 URL 建立政策聲明
  1. 使用下列 JSON 格式建構政策聲明。使用您自己的值取代小於 (<) 和大於 (>) 符號及其中的描述。如需詳細資訊,請參閱 您在使用自訂政策的已簽署 URL 政策陳述式中指定的值

    { "Statement": [ { "Resource": "<Optional but recommended: 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 部分的參數順序不重要。

    • 如需有關 ResourceDateLessThanDateGreaterThanIpAddress 值的詳細資訊,請參閱 您在使用自訂政策的已簽署 URL 政策陳述式中指定的值

  2. 從政策陳述式中刪除所有空格 (包括標籤和新行字元)。您可能必須在應用程式的程式碼的字串中包含逸出字元。

  3. 使用 MIME base64 編碼 Base64-encode 政策聲明。如需詳細資訊,請參閱 RFC 2045,MIME (多用途網際網路郵件延伸) 第一部分:網際網路訊息內文的格式中的第 6.8 節:Base64 Content-Transfer-Encoding

  4. 將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。

    取代這些無效的字元 有了這些有效的字元

    +

    - (連字號)

    =

    _ (底線)

    /

    ~ (波狀符號)

  5. Policy= 之後,將結果值附加到已簽章的 URL。

  6. 透過政策聲明進行雜湊、簽名和 base64-encoding 來建立用於簽章 URL 的簽章。如需詳細資訊,請參閱 為使用自訂準政策的已簽署 URL 建立簽章

您在使用自訂政策的已簽署 URL 政策陳述式中指定的值

當您為自訂政策建立政策聲明時,您可以指定以下值。

資源

URL,包括任何查詢字串,但不包括 CloudFront PolicySignature、和Key-Pair-Id參數。例如:

https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes

您只能為 Resource 指定一個 URL 值。

重要

您可以省略政策中的 Resource 參數,但如此便代表任何擁有已簽署 URL 的人,都可以存取與您建立已簽署 URL 的金鑰對關聯的任何分發中的所有檔案。

注意下列事項:

  • 通訊協定 – 此值必須以 http://https://*:// 開頭。

  • 查詢字串參數 – 如果 URL 擁有查詢字串參數,請使用反斜線字元 (\) 來逸出開始查詢字串的問號字元 (?)。例如:

    https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes

  • 萬用字元 – 您可以在政策中的 URL 中使用萬用字元。支援下列萬用字元:

    • 星號 (*),符合零或更多字元

    • 問號 (?),剛好符合一個字元

    當原則中的 URL 與 HTTP 要求中的 URL CloudFront 相符時,原則中的 URL 會分為四個區段 (通訊協定、網域、路徑和查詢字串),如下所示:

    [protocol]://[domain]/[path]\?[query string]

    當您在政策的 URL 中使用萬用字元時,萬用字元比對只會套用在包含萬用字元的區段邊界內。例如,在政策中考量此 URL:

    https://www.example.com/hello*world

    在此範例中,星號萬用字元 (*) 僅適用於路徑區段中,因此它符合 URL https://www.example.com/helloworldhttps://www.example.com/hello-world,但與 URL https://www.example.net/hello?world 不相符。

    下列例外適用於萬用字元相符的區段邊界:

    • 路徑區段中的結尾星號表示查詢字串區段中的星號。例如,http://example.com/hello* 等同於 http://example.com/hello*\?*

    • 網域區段域部分中的結尾星號表示路徑和查詢字串部分中都有星號。例如,http://example.com* 等同於 http://example.com*/*\?*

    • 政策中的 URL 可以省略通訊協定區段,並在網域區段中以星號開頭。在這種情況下,通訊協定部分暗中設為星號。例如,策略 *example.com 中的 URL 等同於 *://*example.com/

    • 星號本身 ("Resource": "*") 符合任何 URL。

    例如,策略 https://d111111abcdef8.cloudfront.net/*game_download.zip* 中的值:符合下列所有 URL:

    • 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 的到期日期和時間。在政策中,不要將值括在引號中。如需世界協調時間的詳細資訊,請參閱網際網路上的日期和時間:時間戳記

例如,2023 年 1 月 31 日上午 10:00 UTC 以 Unix 時間格式轉換為 1675159200。

這是區段中唯一必要的Condition參數。 CloudFront 需要此值以防止用戶永久訪問您的私人內容。

如需更多資訊,請參閱何時 CloudFront 檢查簽名 URL 中的到期日期和時間?

DateGreaterThan (選擇性)

Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 的 URL 的選用日期和時間。不允許用戶在指定的日期和時間或之前訪問文件。不要將值括在引號中。

IpAddress (選擇性)

提出 HTTP 請求的用戶端 IP 地址。注意下列事項:

  • 要允許任何 IP 位址存取該檔案,請省略 IpAddress 參數。

  • 您可以指定一個 IP 地址或一個 IP 地址範圍。如果用戶端的 IP 地址位於兩個不同的範圍之一,則無法設定政策以允許存取。

  • 若要允許從單一 IP 地址存取,您需要指定:

    "IPv4 IP 地址/32"

  • 必須以標準 IPv4 CIDR 格式指定 IP 地址範圍 (例如 192.0.2.0/24)。如需詳細資訊,請參閱《無類別域間路由 (CIDR):網際網路地址指派和彙總計劃》

    重要

    不支援 IPv6 格式的 IP 地址,例如 2001:0db8:85a3::8a2e:0370:7334。

    如果您使用的是包括 IpAddress 的自訂政策,請不要為分佈啟用 IPv6。如果您希望透過 IP 地址限制對某些內容的存取,並支援對其他內容的 IPv6 請求,則可以建立兩個分佈。如需詳細資訊,請參閱 發佈設定參考 主題中的 啟用 IPv6

使用自訂政策的已簽署 URL 範例政策陳述式

以下範例說明政策聲明說明了如何控制對特定檔案的存取、目錄中的所有檔案,或與金鑰對 ID 相關聯的所有檔案。此範例還會說明了如何控制來自個別 IP 地址或各種 IP 地址的存取,以及如何防止使用者在指定的日期和時間過期後使用簽章 URL。

如果複製並貼上這些範例中的任何一項,請刪除所有空格 (包括索引標籤和換行符號字元)、用您自我的值取代該值,並在大括弧 (}) 的後面加上換行字元。

如需詳細資訊,請參閱 您在使用自訂政策的已簽署 URL 政策陳述式中指定的值

範例政策陳述式:從一個 IP 地址範圍存取一個檔案

以下範例自訂政策在已簽署的 URL 中指定使用者在到 UTC 2023 年 1 月 31 日上午 10:00 之前可以從 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": 1675159200 } } } ] }

範例政策陳述式:從一個 IP 地址範圍存取目錄中的所有檔案

以下範例自訂政策允許您為 training 目錄中的任何檔案建立簽章的 URL,如 Resource 參數中的 (*) 萬用字元所示。使用者在到 UTC 2023 年 1 月 31 日上午 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": 1675159200 } } } ] }

您使用此政策的每個已簽章的 URL 都包括一個識別特定的檔案的基本 URL,例如:

https://d111111abcdef8.cloudfront.net/training/orientation.pdf

範例政策陳述式:從一個 IP 地址存取與金鑰對 ID 相關的所有檔案

以下範例自訂政策允許您為與任何分佈關聯的任何檔案建立簽章的 URL,如 Resource 參數中的 (*) 萬用字元所示。已簽署的 URL 必須使用 https:// 通訊協定,而不是 http://。使用者必須使用 IP 地址 192.0.2.10/32。(CIDR 表示法中的 192.0.2.10/32 值是指單個 IP 地址 192.0.2.10。) 這些檔案只能在 2023 年 1 月 31 日上午 10:00 UTC 至 2023 年 2 月 2 日上午 10:00 UTC 之間使用:

{ "Statement": [ { "Resource": "https://*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.10/32" }, "DateGreaterThan": { "AWS:EpochTime": 1675159200 }, "DateLessThan": { "AWS:EpochTime": 1675332000 } } } ] }

您使用此原則的每個已簽署 URL 都有一個可識別特定 CloudFront 發行版中特定檔案的 URL,例如:

https://d111111abcdef8.cloudfront.net/training/orientation.pdf

該已簽署 URL 還包括金鑰對 ID,必須與在基本 URL 中指定的分佈 (d111111abcdef8.cloudfront.net) 中的可信金鑰群組相關聯。

為使用自訂準政策的已簽署 URL 建立簽章

使用自訂政策的已簽章的 URL 的簽章是政策聲明的雜湊、簽章和 base64-encoded 版本。若要建立自訂政策的簽章,請完成以下步驟。

如需有關如何對政策聲明進行雜湊、簽章和編碼的詳細資訊和範例,請參閱:

選項 1:使用自訂政策建立簽章
  1. 使用 SHA-1 雜湊函數和 RSA 對您在為使用自訂政策的已簽章的 URL 建立政策聲明程序中建立的 JSON 政策聲明進行雜湊和簽署。使用不再包含空格但尚未進行 base64 編碼的政策陳述式版本。

    對於雜湊函數所需的私有金鑰,使用其公有金鑰在活動的信任金鑰組中的私有金鑰進行分佈。

    注意

    用於雜湊和簽名政策聲明的方法取決於您的程式設計語言和平台。如需程式碼範例,請參閱 為已簽署 URL 建立簽章的程式碼範例

  2. 從雜湊和已簽署字串中移除所有空格 (包括索引標籤和新行字元)。

  3. 使用 MIME base64 編碼的 Base64-encode 字串。如需詳細資訊,請參閱 RFC 2045,MIME (多用途網際網路郵件延伸) 第一部分:網際網路訊息內文的格式中的第 6.8 節:Base64 Content-Transfer-Encoding

  4. 將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。

    取代這些無效的字元 有了這些有效的字元

    +

    - (連字號)

    =

    _ (底線)

    /

    ~ (波狀符號)

  5. &Signature= 之後,將結果值附加到已簽章的 URL,然後返回到使用自訂政策建立簽章的 URL以完成已簽章的 URL 的各個部分的連接。