Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用标准策略设置签名 Cookie

要使用标准策略设置签名 Cookie,请完成以下步骤。要创建签名,请参阅为使用标准策略的签名 Cookie 创建签名

使用标准策略设置签名 Cookie

  1. 如果您要使用 .NET 和 Java 创建签名 Cookie,但尚未将密钥对私有密钥的格式从默认 .pem 格式重新设置为与 .NET 和 Java 兼容的格式,请立即执行该操作。有关更多信息,请参阅 重新设置 CloudFront 密钥对的格式(仅 .NET 和 Java)。

  2. 将应用程序编程为向批准的查看器发送三个 Set-Cookie 标头。您之所以需要使用三个 Set-Cookie 标头,是因为每个 Set-Cookie 标头只能包含一个名称值对,而 CloudFront 签名 Cookie 需要使用三个名称值对。名称值对为:CloudFront-ExpiresCloudFront-SignatureCloudFront-Key-Pair-Id。在用户首次请求您希望控制访问权的文件时,查看器中必须包含这些值。

    注意

    一般情况下,建议排除 ExpiresMax-Age 属性。如果排除这些属性,那么当用户关闭浏览器时,浏览器会删除 Cookie,这降低了其他人非法访问内容的可能性。有关更多信息,请参阅防止滥用签名 Cookie

    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=active CloudFront key pair Id for the key pair that you are using to generate the signature; Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly
    (可选)Domain

    所请求文件的域名。如果不指定 Domain 属性,则默认值是 URL 中的域名,它仅适用于指定的域名,而不适用于子域。如果指定 Domain 属性,它还将适用于子域。可以选择在域名前加一个句点 (例如 Domain=.example.com)。此外,如果指定 Domain 属性,那么 URL 中的域名则必须与 Domain 属性的值匹配。

    可以指定 CloudFront 为您的分配指定的域名 (例如 d111111abcdef8.cloudfront.net),但不能为域名指定 *.cloudfront.net。

    如果希望在 URL 中使用备用域名 (如 example.com),则必须向分配添加备用域名,而无论是否指定 Domain 属性。有关更多信息,请参阅 备用域名 (CNAME) 主题中的 您创建或更新分配时指定的值

    (可选)Path

    所请求文件的路径。如果未指定 Path 属性,则默认值是 URL 中的路径。

    Secure

    要求查看器先加密 Cookie,然后再发送请求。建议通过 HTTPS 连接发送 Set-Cookie 标头,以确保 Cookie 受到保护,而不会受到中间人攻击。

    HttpOnly

    要求查看器仅在 HTTP 或 HTTPS 请求中发送 Cookie。

    CloudFront-Expires

    指定 Unix 时间格式(以秒为单位) 和协调通用时间 (UTC) 格式的过期日期和时间。例如,2013 年 1 月 1 日上午 10 点 UTC 转换为 Unix 时间格式就是 1357034400。要使用纪元时间,请使用 32 位整数表示日期,该日期不得晚于 2147483647 (2038 年 1 月 19 日,03:14:07 UTC)。有关 UTC 的信息,请参阅 RFC 3339 - Internet 上的日期和时间:时间戳,网址为 http://tools.ietf.org/html/rfc3339

    CloudFront-Signature

    JSON 策略声明经过哈希处理、签署和 Base64 编码的版本。有关更多信息,请参阅 为使用标准策略的签名 Cookie 创建签名

    CloudFront-Key-Pair-Id

    有效 CloudFront 密钥对的 ID,例如 APKA9ONS7QCOWEXAMPLE。CloudFront 密钥对 ID 告诉 CloudFront 哪个公有密钥可用于验证签名 Cookie。CloudFront 将签名中的信息和策略声明中的信息进行比较,以验证该 URL 没有被篡改。

    包含在 CloudFront 签名 Cookie 中的密钥对 ID 必须与作为缓存行为可信签署人之一的 AWS 账户关联。

    有关更多信息,请参阅 指定可创建签名 URL 和签名 Cookie 的 AWS 账户 (可信签署人)

    如果在轮换 CloudFront 密钥对时使密钥对无效,则必须更新应用程序,以使用某个可信签署人的新有效密钥对。有关轮换密钥对的更多信息,请参阅 轮换 CloudFront 密钥对

以下示例显示了在文件的 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=APKA9ONS7QCOWEXAMPLE; 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=APKA9ONS7QCOWEXAMPLE; Domain=example.org; Path=/images/*; Secure; HttpOnly

如果希望在 URL 中使用备用域名 (如 example.com),则必须向分配添加备用域名,而无论是否指定 Domain 属性。有关更多信息,请参阅 备用域名 (CNAME) 主题中的 您创建或更新分配时指定的值

为使用标准策略的签名 Cookie 创建签名

要为使用标准策略的签名 Cookie 创建签名,请执行以下操作:

  1. 创建策略声明。请参阅 为使用标准策略的签名 Cookie 创建策略声明

  2. 签署策略声明以创建签名。请参阅 签署策略声明,以便为使用标准策略的签名 Cookie 创建签名

为使用标准策略的签名 Cookie 创建策略声明

设置使用标准策略的签名 URL 时,CloudFront-Signature 属性是策略声明的经过哈希处理和签署的版本。对于使用标准策略的签名 Cookie,请不要像在使用自定义策略的签名 Cookie 一样在 Set-Cookie 标头中包含策略声明。要创建策略声明,请执行以下过程。

为使用标准策略的签名 Cookie 创建策略声明

  1. 使用以下 JSON 格式以及 UTF-8 字符编码构建策略声明。根据指定,准确包括所有标点符号和其他文本值。有关 ResourceDateLessThan 参数的信息,请参阅 在策略声明中为使用标准策略的签名 Cookie 指定的值

    { "Statement":[ { "Resource":"base URL or stream name", "Condition":{ "DateLessThan":{ "AWS:EpochTime":ending date and time in Unix time format and UTC } } } ] }
  2. 删除策略声明中的所有空格 (包括制表符和换行符)。您可能需要在应用程序代码的字符串中包括换码符。

在策略声明中为使用标准策略的签名 Cookie 指定的值

为标准策略创建策略声明时,请指定以下值:

资源

包含查询字符串 (如果有) 的基本 URL,例如:

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

只能为 Resource 指定一个值。

请注意以下几点:

  • 协议 – 该值必须以 http://https:// 开头。

  • 查询字符串参数 – 如果没有查询字符串参数,请省略问号。

  • 备用域名 – 如果在 URL 中指定备用域名 (CNAME),则必须在引用网页或应用程序中的文件时指定备用域名。切勿为文件指定 Amazon S3 URL。

DateLessThan

Unix 时间格式(以秒为单位)和协调通用时间 (UTC) 格式的 URL 过期日期和时间。切勿用引号将该值括起来。

例如,UTC 时间 2015 年 3 月 16 日上午 10 点转换为 Unix 时间格式就是 1426500000。

该值必须与 CloudFront-Expires 标头中的 Set-Cookie 属性的值匹配。切勿用引号将该值括起来。

有关更多信息,请参阅 CloudFront 何时检查签名 Cookie 中的过期日期和时间?

标准策略的示例策略声明

当在签名 Cookie 中使用以下示例策略声明时,用户可访问文件 http://d111111abcdef8.cloudfront.net/horizon.jpg,直至 UTC 时间 2015 年 3 月 16 日上午 10 点:

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

签署策略声明,以便为使用标准策略的签名 Cookie 创建签名

要为 CloudFront-Signature 标头中的 Set-Cookie 属性创建值,请对在 为使用标准策略的签名 Cookie 创建策略声明 中创建的策略声明进行哈希处理并签署。

有关如何对策略声明进行哈希、签署及编码的更多信息和示例,请参阅以下主题:

为使用标准策略的签名 Cookie 创建签名

  1. 使用 SHA-1 哈希函数和 RSA 对在为使用标准策略的签名 Cookie 创建策略声明过程中创建的策略声明进行哈希处理并签署。请使用不再包含空格的策略声明版本。

    对于散列函数所要求的私钥,使用与有效可信签署人关联的私钥。

    注意

    您用于哈希及签署策略声明的方法取决于您的编程语言和平台。有关示例代码,请参阅 为签名 URL 创建签名的代码示例

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

  3. 使用 MIME Base64 编码对字符串进行 Base64 编码。有关更多信息,请参阅 RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies 中的 Section 6.8, Base64 Content-Transfer-Encoding

  4. 用有效的字符替换 URL 查询字符串中的无效字符。下表列出了无效和有效字符。

    替换这些无效字符 使用这些有效字符

    +

    - (连字符)

    =

    _(下划线)

    /

    ~(波浪字符)

  5. Set-Cookie 名称值对的 CloudFront-Signature 标头中包含结果值。然后返回到使用标准策略设置签名 CookieSet-Cookie 添加 CloudFront-Key-Pair-Id 标头。