

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

# 使用標準政策設定已簽署 Cookie
<a name="private-content-setting-signed-cookie-canned-policy"></a>

若要使用標準政策設定已簽章的 Cookie，請完成以下步驟。若要建立簽章，請參閱 [為使用標準政策的已簽署 Cookie 建立簽章](#private-content-canned-policy-signature-cookies)。<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**使用標準政策設定已簽章的 Cookie**

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

1. 將應用程式設定為傳送三個`Set-Cookie`標頭給核准的檢視器 （如果您想要指定雜湊演算法，則為四個）。您需要三個 `Set-Cookie` 標頭，因為每個 `Set-Cookie` 標頭只能包含一個名稱值組，而 CloudFront 已簽署的 Cookie 需要三個名稱值組。名稱值組是：`CloudFront-Expires`、`CloudFront-Signature` 和 `CloudFront-Key-Pair-Id`。您可以選擇包含第四個名稱值對 `CloudFront-Hash-Algorithm`，以指定用於簽章的雜湊演算法。在使用者對要控制存取的檔案發出第一次請求之前，這些值必須出現在檢視器。
**注意**  
一般而言，建議您排除 `Expires` 和 `Max-Age` 屬性。排除這些屬性會導致瀏覽器在使用者關閉瀏覽器時刪除 Cookie，從而降低有人未經授權存取您的內容的可能性。如需詳細資訊，請參閱[防止濫用已簽署 Cookie](private-content-signed-cookies.md#private-content-signed-cookie-misuse)。

   **Cookie 屬性的名稱區分大小寫**。

   只包含分行符號，以使屬性更易讀。

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   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
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(選用) `Domain`**  
請求檔案的網域名稱。如果不指定 `Domain` 屬性，則預設值是 URL 中的網域名稱，並且它僅適用於指定的網域名稱，而不適用於子網域名稱。如果指定 `Domain` 屬性，它也適用於子網域名稱。網域名稱中的前導點 (例如 `Domain=.example.com`) 是可選的。此外，如果指定 `Domain` 屬性，則 URL 中的網域名稱和 `Domain` 屬性的值必須相符。  
您可以指定 CloudFront 指派給您的分佈的網域名稱，例如，d111111abcdef8.cloudfront.net，但不能為網域名稱指定 \$1.cloudfront.net。  
如果要在 URL 中使用備用網域名稱 (如 example.com)，則無論您是否指定了 `Domain` 屬性，都必須將備用網域名稱新增到分佈中。如需詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md) 主題中的 [備用網域名稱 (CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME)。  
**(選用) `Path`**  
請求檔案的路徑。如果未指定 `Path` 屬性，則預設值為 URL 中的路徑。  
**`Secure`**  
在檢視器傳送請求之前，需要對 Cookie 進行加密。我們建議您透過 HTTPS 連線發送 `Set-Cookie` 標頭，以確保 Cookie 屬性免受中間人攻擊。  
**`HttpOnly`**  
定義瀏覽器 (在支援的情況下) 如何與 Cookie 值互動。使用 `HttpOnly` 時，JavaScript 無法存取 Cookie 值。此預防措施有助於緩解跨網站指令碼 (XSS) 攻擊。如需詳細資訊，請參閱[使用 HTTP cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)。  
**`CloudFront-Expires`**  
以 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](https://tools.ietf.org/html/rfc3339)。  
**`CloudFront-Signature`**  
JSON 政策聲明的雜湊、簽章和 base64-encoded 版本。如需詳細資訊，請參閱 [為使用標準政策的已簽署 Cookie 建立簽章](#private-content-canned-policy-signature-cookies)。  
**`CloudFront-Key-Pair-Id`**  
CloudFront 公有金鑰的 ID，例如 `K2JCJMDEHXQW5F`。公有金鑰 ID 會告訴 CloudFront 要使用哪個公有金鑰來驗證已簽署的 URL。CloudFront 將簽章中的資訊與政策聲明中的資訊進行比較，以驗證該 URL 尚未遭到篡改。  
此公有金鑰必須屬於分佈中信任的簽署者金鑰群組。如需詳細資訊，請參閱[指定可以建立已簽署 URL 和已簽署 Cookie 的簽署者](private-content-trusted-signers.md)。  
**`CloudFront-Hash-Algorithm`**  
（選用） 用來建立簽章的雜湊演算法。支援的值為 `SHA1` 和 `SHA256`。如果您未包含此 Cookie，CloudFront 會預設為 `SHA1`。

以下範例顯示當您使用與檔案的 URL 中的分佈關聯的網域名稱時，一個已簽章的 Cookie 的 `Set-Cookie` 標頭：

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

以下範例顯示當您在檔案的 URL 中使用備用網域名稱 example.org 時，一個已簽章的 Cookie 的 `Set-Cookie` 標頭：

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

如果要在 URL 中使用備用網域名稱 (如 example.com)，則無論您是否指定了 `Domain` 屬性，都必須將備用網域名稱新增到分佈中。如需詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md) 主題中的 [備用網域名稱 (CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME)。

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

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

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

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

當您設定使用標準政策的簽章 Cookie 時，該 `CloudFront-Signature` 屬性是政策聲明的雜湊及已簽章的版本。對於使用標準政策的已簽章的 Cookie，您不會將政策聲明包括在 `Set-Cookie` 標頭中，就像使用自訂政策的已簽章的 Cookie 一樣。若要建立政策陳述式，請完成下列步驟。<a name="private-content-canned-policy-statement-cookies-procedure"></a>

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

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

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

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

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

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

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

**DateLessThan**  
Unix 時間格式 (以秒為單位) 和國際標準時間 (UTC) 的 URL 的到期日期和時間。不要將值括在引號中。  
例如，2015 年 3 月 16 日上午 10:00 UTC 以 Unix 時間格式轉換為 1426500000。  
這個值必須符合 `CloudFront-Expires` 標頭中 `Set-Cookie` 屬性的值。不要將值括在引號中。  
如需詳細資訊，請參閱 [CloudFront 何時檢查已簽署 Cookie 中的到期日期和時間](private-content-signed-cookies.md#private-content-check-expiration-cookie)。

#### 標準政策的範例政策陳述式
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

當您在已簽章的 Cookie 中使用以下範例政策聲明時，使用者在到 UTC 2015 年 3 月 16 日上午 10:00 之前可以存取檔案 `https://d111111abcdef8.cloudfront.net/horizon.jpg`：

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

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

要為 `CloudFront-Signature` 標頭中的 `Set-Cookie` 屬性建立值，請對您在 [為使用標準政策的已簽章的 Cookie 建立政策聲明](#private-content-canned-policy-statement-cookies-procedure) 中建立的政策聲明進行雜湊和簽署。

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

**注意**  
連結的範例預設使用 SHA-1。若要改為使用 SHA-256，請在 OpenSSL 命令`sha256`中`sha1`將 取代為 ，並包含值為 的 `CloudFront-Hash-Algorithm` Cookie`SHA256`。<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**使用標準政策為已簽章的 Cookie 建立簽章**

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

   如果您使用 SHA-256，則必須包含值為 的 `CloudFront-Hash-Algorithm` Cookie`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-setting-signed-cookie-canned-policy.html)

1. 將結果值包含在 `Set-Cookie` 名稱值組的 `CloudFront-Signature` 標頭中。然後返回到 [使用標準政策設定已簽章的 Cookie](#private-content-setting-signed-cookie-canned-policy-procedure) 為 `Set-Cookie` 新增 `CloudFront-Key-Pair-Id` 標頭。