

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

# 使用自訂政策建立已簽署 URL
<a name="private-content-creating-signed-url-custom-policy"></a>

若要使用自訂政策建立簽章的 URL，請完成以下程序。<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**使用自訂政策建立簽章的 URL**

1. 如果您使用 .NET 或 Java 建立簽章的 URL，並且您還沒有將金鑰對的私有金鑰從預設的 .pem 格式重新格式化為與 .NET 或 Java 相容的格式，則現在執行此操作。如需詳細資訊，請參閱[重新格式化私有金鑰 (僅限 .NET 和 Java)](private-content-trusted-signers.md#private-content-reformatting-private-key)。

1. 串連下列值。您可以在此已簽署 URL 範例中使用格式。

   

   ```
   {{https://d111111abcdef8.cloudfront.net/image.jpg}}?{{color=red&size=medium&}}Policy={{eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo}}&Signature={{nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6}}&Key-Pair-Id={{K2JCJMDEHXQW5F}}&Hash-Algorithm={{SHA256}}
   ```

   移除所有空格 (包括標籤和換行字元)。您可能必須在應用程式的程式碼的字串中包含逸出字元。所有值都有一個 `String` 類型。  
**1. {{檔案的基本 URL}}**  
如果您未使用簽署的 URL，包括您自我的查詢字串參數 (如果有)，則基本 URL 是您用來存取檔案的 CloudFront URL。在上述範例中，基本 URL 為 `https://d111111abcdef8.cloudfront.net/image.jpg`。如需有關分佈的 URL 格式的詳細資訊，請參閱 [自訂 CloudFront 中檔案的 URL 格式](LinkFormat.md)。  
以下範例說明您為分佈指定的值。  
   + 下列 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. {{您的查詢字串參數 (如果有的話)}}`&`**  
(選用) 您可以輸入自己的查詢字串參數。若要這樣做，請在每個參數之間新增 and (&)，例如 `color=red&size=medium`。您可以在 URL 內以任何順序指定查詢字串參數。  
您的查詢字串參數無法命名為 `Policy`、`Key-Pair-Id`、 `Signature`或 `Hash-Algorithm`。
如果加入自己的參數，請在每個參數的後面附加一個 `&`，包括最後一個參數。  
**4. `Policy=`{{base64 編碼版本的政策陳述式}}**  
您的政策陳述式採用 JSON 格式，刪除了空格，然後使用 base64 編碼。如需詳細資訊，請參閱[為使用自訂政策的已簽署 URL 建立政策陳述式](#private-content-custom-policy-statement)。  
政策陳述式可控制簽署的 URL 授予使用者的存取權限。它包括檔案的 URL、到期日期和時間、URL 變成有效的選擇性日期和時間，以及允許存取檔案的選用 IP 位址或 IP 位址範圍。  
**5. `&Signature=`{{政策陳述式的雜湊和簽署版本}}**  
JSON 政策聲明的雜湊、簽章和 base64-encoded 版本。如需詳細資訊，請參閱[為使用自訂準政策的已簽署 URL 建立簽章](#private-content-custom-policy-creating-signature)。  
**6. `&Key-Pair-Id=`{{CloudFront 公有金鑰的公有金鑰 ID，您用來產生簽章的對應私有金鑰}}**  
CloudFront 公有金鑰的 ID，例如 `K2JCJMDEHXQW5F`。公有金鑰 ID 會告訴 CloudFront 要使用哪個公有金鑰來驗證已簽署的 URL。CloudFront 將簽章中的資訊與政策聲明中的資訊進行比較，以驗證該 URL 尚未遭到篡改。  
此公有金鑰必須屬於分佈中信任的簽署者金鑰群組。如需詳細資訊，請參閱[指定可以建立已簽署 URL 和已簽署 Cookie 的簽署者](private-content-trusted-signers.md)。  
**7. `&Hash-Algorithm=`{{SHA1 或 SHA256}}**  
（選用） 用來建立簽章的雜湊演算法。支援的值為 `SHA1` 和 `SHA256`。如果您未指定此參數，CloudFront 會預設為 `SHA1`。

## 為使用自訂政策的已簽署 URL 建立政策陳述式
<a name="private-content-custom-policy-statement"></a>

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

如需以各種方式控制對檔案存取的政策聲明範例，請參閱 [使用自訂政策的已簽署 URL 範例政策陳述式](#private-content-custom-policy-statement-examples)。<a name="private-content-custom-policy-creating-policy-procedure"></a>

**為使用自訂政策的已簽章的 URL 建立政策聲明**

1. 使用下列 JSON 格式建構政策聲明。使用您自己的值取代小於 (`<`) 和大於 (`>`) 符號及其中的描述。如需詳細資訊，請參閱[您在使用自訂政策的已簽署 URL 政策陳述式中指定的值](#private-content-custom-policy-statement-values)。

   ```
   {
       "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` 部分的參數順序不重要。
   + 如需有關 `Resource`、`DateLessThan`、`DateGreaterThan` 和 `IpAddress` 值的詳細資訊，請參閱 [您在使用自訂政策的已簽署 URL 政策陳述式中指定的值](#private-content-custom-policy-statement-values)。

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

1. 使用 MIME base64 編碼 Base64-encode 政策聲明。如需詳細資訊，請參閱 *RFC 2045，MIME (多用途網際網路郵件延伸) 第一部分：網際網路訊息內文的格式*中的[第 6.8 節：Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8)。

1. 將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. 在 `Policy=` 之後，將結果值附加到已簽章的 URL。

1. 透過政策聲明進行雜湊、簽名和 base64-encoding 來建立用於簽章 URL 的簽章。如需詳細資訊，請參閱[為使用自訂準政策的已簽署 URL 建立簽章](#private-content-custom-policy-creating-signature)。

### 您在使用自訂政策的已簽署 URL 政策陳述式中指定的值
<a name="private-content-custom-policy-statement-values"></a>

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

**資源**  
URL，包括任何查詢字串，但不包括 CloudFront `Policy`、`Key-Pair-Id`、 `Signature`和 `Hash-Algorithm` 參數。例如：  
`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 中使用萬用字元。支援下列萬用字元：
  + 星號 (`*`)，符合零或更多字元
  + 問號 (`?`)，剛好符合一個字元

  在 CloudFront 將政策中的 URL 與 HTTP 要求中的 URL 相符時，政策中的 URL 會分為四個區段－通訊協定、網域、路徑和查詢字串)，如下所示：

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

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

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

  在此範例中，星號萬用字元 (`*`) 僅適用於路徑區段中，因此它符合 URL `https://www.example.com/helloworld` 和 `https://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 的到期日期和時間。在政策中，不要將值括在引號中。如需世界協調時間的詳細資訊，請參閱[網際網路上的日期和時間：時間戳記](https://tools.ietf.org/html/rfc3339)。  
例如，2023 年 1 月 31 日上午 10:00 UTC 以 Unix 時間格式轉換為 1675159200。  
這是 `Condition` 部分中唯一需要的參數。CloudFront 請求這個值，以防止使用者永久存取您的私有內容。  
如需詳細資訊，請參閱[CloudFront 何時檢查已簽署 URL 中的到期日期和時間](private-content-signed-urls.md#private-content-check-expiration)

**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)：網際網路地址指派和彙總計劃》](https://tools.ietf.org/html/rfc4632)。
**重要**  
不支援 IPv6 格式的 IP 位址，例如 2001:0db8:85a3::8a2e:0370:7334。

  如果您使用的是包括 `IpAddress` 的自訂政策，請不要為分佈啟用 IPv6。如果您希望透過 IP 位址限制對某些內容的存取，並支援對其他內容的 IPv6 請求，則可以建立兩個分佈。如需詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md) 主題中的 [啟用 IPv6 (檢視器請求)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6)。

## 使用自訂政策的已簽署 URL 範例政策陳述式
<a name="private-content-custom-policy-statement-examples"></a>

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

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

如需詳細資訊，請參閱[您在使用自訂政策的已簽署 URL 政策陳述式中指定的值](#private-content-custom-policy-statement-values)。

**Topics**
+ [範例政策陳述式：從一個 IP 位址範圍存取一個檔案](#private-content-custom-policy-statement-example-one-object)
+ [範例政策陳述式：從一個 IP 位址範圍存取目錄中的所有檔案](#private-content-custom-policy-statement-example-all-objects)
+ [範例政策陳述式：從一個 IP 位址存取與金鑰對 ID 相關的所有檔案](#private-content-custom-policy-statement-example-one-ip)

### 範例政策陳述式：從一個 IP 位址範圍存取一個檔案
<a name="private-content-custom-policy-statement-example-one-object"></a>

以下範例自訂政策在已簽署的 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 位址範圍存取目錄中的所有檔案
<a name="private-content-custom-policy-statement-example-all-objects"></a>

以下範例自訂政策允許您為 `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 相關的所有檔案
<a name="private-content-custom-policy-statement-example-one-ip"></a>

以下範例自訂政策允許您為與任何分佈關聯的任何檔案建立簽章的 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 都包括一個基本 URL，用於識別特定 CloudFront 分佈中的特定檔案，例如：

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

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

## 為使用自訂準政策的已簽署 URL 建立簽章
<a name="private-content-custom-policy-creating-signature"></a>

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

如需有關如何對政策聲明進行雜湊、簽章和編碼的詳細資訊和範例，請參閱：
+ [用於 Base64 編碼和加密的 Linux 命令和 OpenSSL](private-content-linux-openssl.md)
+ [為已簽署 URL 建立簽章的程式碼範例](PrivateCFSignatureCodeAndExamples.md)

**注意**  
連結的範例預設使用 SHA-1。若要改為使用 SHA-256，請在 OpenSSL 命令`sha256`中將 取代`sha1`為 ，並在簽章的 URL 中包含`Hash-Algorithm=SHA256`查詢參數。<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**選項 1：使用自訂政策建立簽章**

1. 使用 SHA-1 或 SHA-256 雜湊函數和產生的 RSA 或 ECDSA 私有金鑰來雜湊並簽署您在程序 中建立的 JSON 政策陳述式[為使用自訂政策的已簽章的 URL 建立政策聲明](#private-content-custom-policy-creating-policy-procedure)。使用不再包含空格但尚未進行 base64 編碼的政策陳述式版本。

   如果您使用 SHA-256，則必須在簽章的 URL `&Hash-Algorithm=SHA256`中包含 。

   對於雜湊函數所需的私有金鑰，使用其公有金鑰在活動的信任金鑰組中的私有金鑰進行分佈。
**注意**  
用於雜湊和簽名政策聲明的方法取決於您的程式設計語言和平台。如需程式碼範例，請參閱 [為已簽署 URL 建立簽章的程式碼範例](PrivateCFSignatureCodeAndExamples.md)。

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

1. 使用 MIME base64 編碼的 Base64-encode 字串。如需詳細資訊，請參閱 *RFC 2045，MIME (多用途網際網路郵件延伸) 第一部分：網際網路訊息內文的格式*中的[第 6.8 節：Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8)。

1. 將 URL 查詢字串中無效的字元替換為有效的字元。下表列出無效和有效的字元。  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. 在 `&Signature=` 之後，將結果值附加到已簽章的 URL，然後返回到[使用自訂政策建立簽章的 URL](#private-content-creating-signed-url-custom-policy-procedure)以完成已簽章的 URL 的各個部分的連接。