

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

# 使用已簽署 URL
<a name="private-content-signed-urls"></a>

已簽章的 URL 包含附加資訊，例如到期日期和時間，以便您更有效地控制對內容的存取。此附加資訊顯示在政策聲明中，該政策聲明基於標準政策或自訂政策。標準和自訂政策之間的差異將在接下來的兩節中說明。

**注意**  
您可使用標準政策建立一些簽章的 URL，並使用自訂政策為相同的分佈建立一些簽章的 URL。

**Topics**
+ [決定對已簽署 URL 使用標準或自訂政策](#private-content-choosing-canned-custom-policy)
+ [已簽署 URL 的工作方式](#private-content-how-signed-urls-work)
+ [決定已簽署 URL 的有效時間](#private-content-overview-choosing-duration)
+ [CloudFront 何時檢查已簽署 URL 中的到期日期和時間](#private-content-check-expiration)
+ [範例程式碼和第三方工具](#private-content-overview-sample-code)
+ [使用標準政策建立已簽署 URL](private-content-creating-signed-url-canned-policy.md)
+ [使用自訂政策建立已簽署 URL](private-content-creating-signed-url-custom-policy.md)

## 決定對已簽署 URL 使用標準或自訂政策
<a name="private-content-choosing-canned-custom-policy"></a>

當您建立已簽章的 URL 時，您將編寫一個 JSON 格式的政策聲明來指定對已簽章的 URL 的限制，例如 URL 的有效時間。您可以使用標準政策或自訂政策。以下是標準和自訂政策的比較：


****  

| 描述 | 標準政策 | 自訂政策 | 
| --- | --- | --- | 
| 您可以重複使用多個檔案的政策聲明。要重複使用政策聲明，您必須在 `Resource` 物件中使用萬用字元。如需詳細資訊，請參閱 [您在使用自訂政策的已簽署 URL 政策陳述式中指定的值](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values))。 | 否 | 是 | 
| 您可以指定使用者可以開始存取您的內容的日期和時間。 | 否 | 是 (選用) | 
| 您可以指定使用者無法再存取您的內容的日期和時間。 | 是 | 是 | 
| 您可以指定可以存取您的內容的使用者的 IP 位址或 IP 位址範圍。 | 否 | 是 (選用) | 
| 該已簽章的 URL 包含該政策的 base64 編碼版本，這會導致較長的 URL。 | 否 | 是 | 

如需使用*標準*政策建立已簽署的 URL 的詳細資訊，請參閱 [使用標準政策建立已簽署 URL](private-content-creating-signed-url-canned-policy.md)。

如需使用*自訂*政策建立已簽署的 URL 的詳細資訊，請參閱 [使用自訂政策建立已簽署 URL](private-content-creating-signed-url-custom-policy.md)。

## 已簽署 URL 的工作方式
<a name="private-content-how-signed-urls-work"></a>

以下概述您如何為已簽署的 URL 設定 CloudFront 和 Amazon S3，以及當使用者使用已簽署的 URL 要求檔案時，CloudFront 如何回應。

1. 在您的 CloudFront 分佈中，指定一或多個信任的金鑰群組，其中包含 CloudFront 可用來驗證 URL 簽章的公有金鑰。您可以使用對應的私有金鑰來簽署 URL。

   CloudFront 支援具有 RSA 2048 和 ECDSA 256 金鑰簽章的已簽署 URL。

   如需詳細資訊，請參閱[指定可以建立已簽署 URL 和已簽署 Cookie 的簽署者](private-content-trusted-signers.md)。

1. 開發應用程式以判斷使用者是否應該有權存取您的內容，並為您所要限制存取的應用程式的檔案或某些部分建立的簽署 URL。如需詳細資訊，請參閱下列主題：
   + [使用標準政策建立已簽署 URL](private-content-creating-signed-url-canned-policy.md)
   + [使用自訂政策建立已簽署 URL](private-content-creating-signed-url-custom-policy.md)

1. 使用者請求檔案用於所要請求的簽章 URL。

1. 您的應用程式會驗證使用者是否有權存取檔案：他們已經登入，他們已經支付存取內容的費用，或者他們已經滿足其他一些存取要求。

1. 您的應用程式會建立和傳回已簽章的 URL 給使用者。

1. 已簽章的 URL 允許使用者下載或串流內容。

   這個步驟是自動的；使用者通常不需要執行任何額外操作來存取內容。例如，如果使用者在 Web 瀏覽器l中存取您的內容時，則應用程式會將已簽章的 URL 傳回到瀏覽器。瀏覽器立即使用已簽署的 URL 存取 CloudFront 邊緣快取中的檔案，無需使用者的任何干預。

1. CloudFront 使用公有金鑰來驗證簽章，並確認 URL 尚未遭到篡改。如果簽章無效，請求會遭到拒絕。

   如果簽章有效，CloudFront 將查看 URL 中的政策聲明 (或如果使用的是標準政策，則建構一個聲明) 以確認請求仍然有效。例如，如果您為 URL 指定了開始和結束日期和時間，CloudFront 會確認使用者在您希望允許存取的時間段內嘗試存取您的內容。

   如果請求符合政策聲明中的請求，CloudFront 會執行標準操作：決定檔案是否已經在邊緣上快取，如果需要，將請求轉傳到原始伺服器，並將該檔案傳回給使用者。

**注意**  
如果不帶正負號的 URL 包含查詢字串參數，請務必將這些參數包含在您已簽署 URL 部分中。如果在簽署已簽署 URL 之後，將查詢字串新增此 URL，則 URL 會傳回 HTTP 403 狀態。

## 決定已簽署 URL 的有效時間
<a name="private-content-overview-choosing-duration"></a>

您可以分配私有內容以僅在短時間內使用已簽章的有效 URL (可能只有區區幾分鐘)。有效期很短的簽章 URL 適合於為了特定目的而將內容即時分佈給使用者，例如按需要對客戶作電影租賃或音樂下載的分佈。如果已簽章的 URL 僅在短時間內有效，您可能會希望使用您開發的應用程式自動產生他們。當使用者開始下載檔案或開始播放媒體檔案時，CloudFront 會將 URL 中的到期時間與目前時間進行比較，以判斷 URL 是否仍然有效。

您還可以使用有效期較長的 (可能會持續數年) 已簽章的 URL 分配私有內容。有效期較長的已簽章的 URL 對於向已知使用者分佈私有內容非常有用，例如向投資者分佈業務計畫或向員工分佈培訓教材。您可以開發應用程式，為您產生這些長期簽署的 URL。

## CloudFront 何時檢查已簽署 URL 中的到期日期和時間
<a name="private-content-check-expiration"></a>

CloudFront 會在 HTTP 請求時，在已簽署 URL 中檢查過期日期和時間。如果用戶端在到期前一刻才開始下載大型檔案，則即使在下載期間過期了，下載也應該要完成。如果 TCP 連線中斷並且用戶端在到期時間過後嘗試重新啟動下載，則下載將失敗。

如果用戶端使用範圍 GET 以取得較小型的檔案，則到期時間過後發生的任何 GET 請求都將失敗。如需範圍 GET 的詳細資訊，請參閱 [CloudFront 如何處理物件的部分請求 (範圍 GET)](RangeGETs.md)。

## 範例程式碼和第三方工具
<a name="private-content-overview-sample-code"></a>

如需建立已簽署 URL 的雜湊和已簽署部分的範例程式碼，請參閱下列主題：
+ [使用 Perl 建立 URL 簽章](CreateURLPerl.md)
+ [使用 PHP 建立 URL 簽章](CreateURL_PHP.md)
+ [使用 C\$1 和 .NET 架構建立 URL 簽章](CreateSignatureInCSharp.md)
+ [使用 Java 建立 URL 簽章](CFPrivateDistJavaDevelopment.md)

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

若要使用標準政策建立已簽署 URL，請完成以下步驟。<a name="private-content-creating-signed-url-canned-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&Expires=1767290400&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 內以任何順序指定查詢字串參數。  
您的查詢字串參數無法命名為 `Expires`、`Key-Pair-Id`、 `Signature`或 `Hash-Algorithm`。  
** 4. `Expires=`*Unix 時間格式的日期和時間 (以秒為單位) 和國際標準時間 (UTC)***  
您希望 URL 停止允許存取檔案的日期和時間。  
以 Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 指定過期日期和時間。例如，2026 年 1 月 1 日上午 10:00 UTC 會以 Unix 時間格式轉換為 `1767290400`，如本主題開頭的範例所示。  
若要使用 epoch 時間，請為不晚於 `9223372036854775807` 的日期指定 64 位元整數 (2262 年 4 月 11 日星期五 23:47:16.854 UTC)。  
  
如需世界協調時間的詳細資訊，請參閱 [RFC 3339、網際網路上的日期和時間：時間戳記](https://tools.ietf.org/html/rfc3339)。  
** 5. `&Signature=`*政策陳述式的雜湊和簽署版本***  
JSON 政策聲明的雜湊、簽章和 base64-encoded 版本。如需詳細資訊，請參閱[為使用標準政策的已簽署 URL 建立簽章](#private-content-canned-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-canned-policy-creating-signature"></a>

若要為使用標準政策的已簽署 URL 建立簽章，請完成下列程序。

**Topics**
+ [為使用標準政策的已簽署 URL 建立政策陳述式](#private-content-canned-policy-creating-policy-statement)
+ [為使用標準政策的已簽署 URL 建立簽章](#private-content-canned-policy-signing-policy-statement)

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

當您使用標準政策建立已簽章的 URL 時，`Signature` 參數是政策聲明的雜湊和簽章版本。對於使用標準政策的簽章的 URL，您不會將政策聲明包括在 URL 中，就像您使用自訂政策的已簽章的 URL 一樣。若要建立政策聲明，請執行下列程序。<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**為使用標準政策的已簽章的 URL 建立政策聲明**

1. 建構政策聲明，使用下列 JSON 格式，並使用 UTF-8 字元編碼。完全按照規定包含所有標點符號和其他常值。如需有關 `Resource` 和 `DateLessThan` 參數的詳細資訊，請參閱 [您在使用標準政策的已簽署 URL 的政策陳述式中指定的值](#private-content-canned-policy-statement-values)。

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

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

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

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

**資源**  
您只能為 `Resource` 指定一個值。
包含查詢字串的基本 URL，如果有的話，但不包括 CloudFront `Expires`、`Key-Pair-Id`、 `Signature`和 `Hash-Algorithm` 參數，例如：  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
注意下列事項：  
+ **通訊協定** – 此值必須以 `http://` 或 `https://` 開頭。
+ **查詢字串參數** – 如果沒有查詢字串參數，請省略問號。
+ **替代網域名稱** – 如果在 URL 中指定了替代網域名稱 (CNAME)，則在引用網頁或應用程式中的檔案時，必須指定替代網域名稱。請勿為物件指定 Amazon S3 URL。

**DateLessThan**  
Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 的 URL 的到期日期和時間。例如，2026 年 1 月 1 日上午 10:00 UTC 以 Unix 時間格式轉換為 1767290400。  
此值必須與已簽章的 URL 中的 `Expires` 查詢字串參數的值相符。不要將值括在引號中。  
如需詳細資訊，請參閱 [CloudFront 何時檢查已簽署 URL 中的到期日期和時間](private-content-signed-urls.md#private-content-check-expiration)。

#### 使用標準政策的已簽署 URL 範例政策陳述式
<a name="private-content-canned-policy-creating-policy-statement-example"></a>

當您在已簽署 URL 中使用以下範例政策陳述式時，使用者在到 UTC 2026 年 1 月 1 日上午 10:00 之前可以存取檔案 `https://d111111abcdef8.cloudfront.net/horizon.jpg`：

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### 為使用標準政策的已簽署 URL 建立簽章
<a name="private-content-canned-policy-signing-policy-statement"></a>

若要在已簽章的 URL 中建立 `Signature` 參數的值，請對您在 [為使用標準政策的已簽署 URL 建立政策陳述式](#private-content-canned-policy-creating-policy-statement) 中建立的政策聲明進行雜湊和簽署。

如需有關如何對政策聲明進行雜湊、簽章和編碼的詳細資訊和範例，請參閱：
+ [用於 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-canned-policy-creating-signature-download-procedure"></a>

**選項 1：使用標準政策建立簽章**

1. 使用 SHA-1 或 SHA-256 雜湊函數和產生的 RSA 或 ECDSA 私有金鑰來雜湊並簽署您在程序 中建立的政策陳述式[為使用標準政策的已簽章的 URL 建立政策聲明](#private-content-canned-policy-creating-policy-statement-procedure)。使用不再包含空格之政策陳述式的版本。

   如果您使用 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-canned-policy.html)

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

# 使用自訂政策建立已簽署 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 的各個部分的連接。