

# 使用自定义策略设置签名 Cookie
<a name="private-content-setting-signed-cookie-custom-policy"></a>

要使用自定义策略设置签名 Cookie，请完成以下步骤。<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**使用自定义策略设置签名 Cookie**

1. 如果您使用 .NET 和 Java 创建签名 URL，而且，如果您尚未将密钥对私有密钥的格式从默认 .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-Policy`、`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-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
   
   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` 属性。有关更多信息，请参阅 [备用域名 (CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME)主题中的 [所有分配设置参考](distribution-web-values-specify.md)。  
**（可选）`Path`**  
所请求文件的路径。如果未指定 `Path` 属性，则默认值是 URL 中的路径。  
**`Secure`**  
要求查看器先加密 Cookie，然后再发送请求。建议通过 HTTPS 连接发送 `Set-Cookie` 标头，以确保 Cookie 受到保护，而不会受到中间人攻击。  
**`HttpOnly`**  
要求查看器仅在 HTTP 或 HTTPS 请求中发送 Cookie。  
**`CloudFront-Policy`**  
您的策略声明采用 JSON 格式，删除了空格，然后进行 Base64 编码。有关更多信息，请参阅 [为使用自定义策略的签名 Cookie 创建签名](#private-content-custom-policy-signature-cookies)。  
策略语句控制签名 Cookie 授予用户的访问权限。它包括用户可以访问的文件、过期日期和时间、URL 生效的可选日期和时间、允许访问文件的可选 IP 地址或 IP 地址范围。  
**`CloudFront-Signature`**  
JSON 策略声明经过哈希处理、签署和 Base64 编码的版本。有关更多信息，请参阅 [为使用自定义策略的签名 Cookie 创建签名](#private-content-custom-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`。

## 自定义策略的 `Set-Cookie` 标头示例
<a name="example-set-cookie-headers-custom-policy"></a>

请参阅以下 `Set-Cookie` 标头对示例。

如果您希望在 URL 中使用备用域名（如 example.com），则无论您是否指定 `Domain` 属性，都必须向分配中添加备用域名。有关更多信息，请参阅 [备用域名 (CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME)主题中的 [所有分配设置参考](distribution-web-values-specify.md)。

**Example 示例 1**  
在文件的 URL 中使用与分配关联的域名时，您可以将 `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
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example 示例 2**  
在文件的 URL 中使用备用域名（example.org）时，您可以将 `Set-Cookie` 标头用于一个已签名的 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
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example 示例 3**  
在文件的 URL 中使用与分配关联的域名时，您可以将 `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
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example 示例 4**  
在文件的 URL 中使用与分配关联的备用域名（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
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

## 为使用自定义策略的签名 Cookie 创建策略声明
<a name="private-content-custom-policy-statement-cookies"></a>

要创建自定义策略的策略声明，请完成以下步骤。有关以各种方式控制访问文件的一些示例策略声明，请参阅[使用自定义策略的签名 Cookie 的示例策略声明](#private-content-custom-policy-statement-signed-cookies-examples)。<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**为使用自定义策略的签名 Cookie 创建策略声明**

1. 使用以下 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 的策略声明中指定的值](#private-content-custom-policy-statement-cookies-values)。

1. 删除策略声明中的所有空格（包括制表符和换行符）。您可能需要在应用程序代码的字符串中包括换码符。

1. 使用 MIME Base64 编码对策略声明进行 Base64 编码。有关更多信息，请参阅 *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies* 中的 [Section 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_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. 将结果值包含在 `Set-Cookie` 标头的 `CloudFront-Policy=` 之后。

1. 通过对策略声明进行哈希、签署及 Base64 编码处理，为 `CloudFront-Signature` 的 `Set-Cookie` 标头创建签名。有关更多信息，请参阅 [为使用自定义策略的签名 Cookie 创建签名](#private-content-custom-policy-signature-cookies)。

### 在使用自定义策略的签名 Cookie 的策略声明中指定的值
<a name="private-content-custom-policy-statement-cookies-values"></a>

针对自定义策略创建策略声明时，请指定以下值。

**资源**  
包含查询字符串 (如果有) 的基本 URL：  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
如果省略 `Resource` 参数，用户将可以访问与用于创建签名 URL 的密钥对相关联的任何分配的所有关联文件。
只能为 `Resource` 指定一个值。  
请注意以下几点：  
+ **协议** – 该值必须以 `http://` 或 `https://` 开头。
+ **查询字符串参数** – 如果没有查询字符串参数，请省略问号。
+ **通配符** – 可以使用与零个或更多个字符匹配的通配符 (\$1)，或者与字符串中的任何位置的一个字符完全匹配的通配符 (?)。例如，值：

  `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 过期日期和时间。切勿用引号将该值括起来。  
例如，UTC 时间 2015 年 3 月 16 日上午 10 点转换为 Unix 时间格式就是 1426500000。  
有关更多信息，请参阅 [CloudFront 何时检查签名 Cookie 中的过期日期和时间](private-content-signed-cookies.md#private-content-check-expiration-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](https://tools.ietf.org/html/rfc4632)。
**重要**  
不支持 IPv6 格式的 IP 地址，如 2001:0db8:85a3::8a2e:0370:7334。

  如果使用包含 `IpAddress` 的自定义策略，请勿为分配启用 IPv6。如果希望通过 IP 地址限制对某些内容的访问并支持其他内容的 IPv6 请求，可以创建两个分配。有关更多信息，请参阅 [启用 IPv6（查看器请求）](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6)主题中的 [所有分配设置参考](distribution-web-values-specify.md)。

## 使用自定义策略的签名 Cookie 的示例策略声明
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

以下示例策略声明显示了如何控制对特定文件、目录中的所有文件或与密钥对 ID 有关的所有文件的访问。这些示例也显示了如何控制来自单个 IP 地址或 IP 地址范围的访问，以及如何防止用户在指定日期和时间后使用签名 Cookie。

如果复制并粘贴其中的任何示例，请删除任何空格（包括制表符和换行符），将值替换为自己的值，并在右大括号（\$1）后面包含一个换行符。

有关更多信息，请参阅 [在使用自定义策略的签名 Cookie 的策略声明中指定的值](#private-content-custom-policy-statement-cookies-values)。

**Topics**
+ [示例策略声明：从 IP 地址范围访问一个文件](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [示例策略声明：从 IP 地址范围访问一个目录中的所有文件](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [示例策略声明：从一个 IP 地址访问与一个密钥对 ID 关联的所有文件](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### 示例策略声明：从 IP 地址范围访问一个文件
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

签名 Cookie 中的以下示例自定义策略指定用户可从范围 `192.0.2.0/24` 内的 IP 地址访问文件 `https://d111111abcdef8.cloudfront.net/game_download.zip`，直至 UTC 时间 2023 年 1 月 1 日上午 10 点：

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### 示例策略声明：从 IP 地址范围访问一个目录中的所有文件
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

以下示例自定义策略允许为 `training` 目录中的任何文件创建签名 Cookie，如 `Resource` 参数中的 \$1 通配符所指示。用户可从范围 `192.0.2.0/24` 内的 IP 地址访问文件，直至 UTC 时间 2013 年 1 月 1 日上午 10 点：

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

在其中使用此策略的每个签名 Cookie 包括用于标识特定文件的基本 URL，例如：

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

### 示例策略声明：从一个 IP 地址访问与一个密钥对 ID 关联的所有文件
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

以下示例自定义策略允许为与任何分配相关联的任何文件设置签名 Cookie，如 `Resource` 参数中的 \$1 通配符所指示。用户必须使用 IP 地址 `192.0.2.10/32`。（CIDR 表示法中的值 `192.0.2.10/32` 指代单个 IP 地址 `192.0.2.10`。） 这些文件仅从 UTC 时间 2013 年 1 月 1 日上午 10 点到 UTC 时间 2013 年 1 月 2 日上午 10 点期间可用：

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

在其中使用此策略的每个签名 Cookie 包括用于标识特定 CloudFront 分配中特定文件的基本 URL，例如：

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

签名 Cookie 还包括密钥对 ID，它必须与您在基本 URL 中指定的分配 (d111111abcdef8.cloudfront.net) 中的可信密钥组关联。

## 为使用自定义策略的签名 Cookie 创建签名
<a name="private-content-custom-policy-signature-cookies"></a>

使用自定义策略的签名 Cookie 的签名是策略声明的哈希、签署及 Base64 编码版本。

有关额外信息以及如何哈希、签署及编码策略声明的示例，请参阅：
+ [用于 Base64 编码和加密的 Linux 命令和 OpenSSL](private-content-linux-openssl.md)
+ [为签名 URL 创建签名的代码示例](PrivateCFSignatureCodeAndExamples.md)

**注意**  
关联的示例默认使用 SHA-1。要改为使用 SHA-256，请在 OpenSSL 命令中将 `sha1` 替换为 `sha256`，并包括值为 `SHA256` 的 `CloudFront-Hash-Algorithm` Cookie。<a name="private-content-custom-policy-signature-cookies-procedure"></a>

**为使用自定义策略的签名 Cookie 创建签名**

1. 使用 SHA-1 或 SHA-256 哈希函数和 RSA 对在[为使用自定义策略的签名 URL 创建策略声明](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure)过程中创建的 JSON 策略声明进行哈希处理并签署。使用不再包含空格但尚未进行 Base64 编码的策略声明版本。

   如果您使用 SHA-256，则必须包含值为 `SHA256` 的 `CloudFront-Hash-Algorithm` Cookie。

   对于哈希函数所需的私有密钥，请使用其公有密钥位于分配的活动可信密钥组中的私有密钥。
**注意**  
您用于哈希及签署策略声明的方法取决于您的编程语言和平台。有关代码示例，请参阅 [为签名 URL 创建签名的代码示例](PrivateCFSignatureCodeAndExamples.md)。

1. 删除经过哈希处理并签署的字符串中的空格（包括制表符和换行符）。

1. 使用 MIME Base64 编码对字符串进行 Base64 编码。有关更多信息，请参阅 *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies* 中的 [Section 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_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. 将结果值包含到 `Set-Cookie` 名称值对的 `CloudFront-Signature=` 标头中，并返回[使用自定义策略设置签名 Cookie](#private-content-setting-signed-cookie-custom-policy-procedure)以添加 `Set-Cookie` 的 `CloudFront-Key-Pair-Id` 标头。