使用自定义策略设置签名 Cookie - Amazon CloudFront
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

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

要使用自定义策略设置签名 Cookie,请执行以下过程。

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

  1. 如果您使用 .NET 和 Java 创建签名 URL,而且,如果您尚未将密钥对私有密钥的格式从默认 .pem 格式重新设置为与 .NET 和 Java 兼容的格式,那么现在就开始设置吧。有关更多信息,请参阅 重新设置 CloudFront 密钥对的格式(仅 .NET 和 Java)。。)

  2. 将应用程序编程为向批准的查看器发送三个 Set-Cookie 标头。您之所以需要使用三个 Set-Cookie 标头,是因为每个 Set-Cookie 标头只能包含一个名称值对,而 CloudFront 签名 Cookie 需要使用三个名称值对。名称值对: CloudFront-PolicyCloudFront-Signature,和 CloudFront-Key-Pair-Id...在用户对要控制访问权限的文件的第一个请求之前,查看器上必须存在该值。

    注意

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

    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=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-Policy

    策略声明采用 JSON 格式,删除了空格,然后进行 Base64 编码。有关更多信息,请参阅 为使用自定义策略的签名 Cookie 创建签名。)

    策略声明控制签名 Cookie 授予用户的访问权:用户可访问的文件、过期日期和时间、URL 生效的可选日期和时间、允许访问文件的可选 IP 地址或 IP 地址范围。

    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-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=APKA9ONS7QCOWEXAMPLE; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly

在文件的 URL 中使用备用域名 example.org 时,一个签名 Cookie 的示例 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=APKA9ONS7QCOWEXAMPLE; Domain=example.org; Path=/; Secure; HttpOnly

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

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

要创建自定义策略的策略声明,请执行以下步骤。有关以各种方式控制访问文件的一些示例政策声明,请参阅使用自定义策略的签名 Cookie 的示例策略声明

为使用自定义策略的签名 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部分中参数的顺序无关紧要。

    • 有关有关该值的信息,请参阅 ResourceDateLessThanDateGreaterThan,和 IpAddress,参见 在使用自定义策略的签名 Cookie 的策略声明中指定的值.

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

  3. 使用 MIME Base64 编码对策略声明进行 Base64 编码。有关详细信息,请参阅 第6.8节,Base64内容传输编码RFC2045、MIME(多用途互联网邮件扩展)第一部分: 互联网消息机构的格式.

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

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

    +

    - (连字符)

    =

    _(下划线)

    /

    ~(波浪字符)

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

  6. 通过对策略声明进行哈希、签署及 Base64 编码处理,为 Set-CookieCloudFront-Signature 标头创建签名。有关更多信息,请参阅 为使用自定义策略的签名 Cookie 创建签名。)

在使用自定义策略的签名 Cookie 的策略声明中指定的值

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

Resource

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

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

重要

如果省略 Resource 参数,用户将可以访问与用于创建签名 URL 的密钥对相关联的任何分配的所有关联文件。

只能为 Resource 指定一个值。

请注意以下几点。

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

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

  • 通配符 – 可以使用与零个或更多个字符匹配的通配符 (*),或者与字符串中的任何位置的一个字符完全匹配的通配符 (?)。例如,值:

    http://d111111abcdef8.cloudfront.net/*game_download.zip*

    将包括(例如)以下文件:

    • http://d111111abcdef8.cloudfront.net/game_download.zip

    • http://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes

    • http://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 中的过期日期和时间?。)

DateGreaterThan(可选)

Unix 时间格式(以秒为单位)和协调通用时间 (UTC) 格式的 URL 可选开始日期和时间。不允许用户在指定的日期和时间之前访问文件。切勿用引号将该值括起来。

IpAddress(可选)

发出 GET 请求的客户端的 IP 地址。请注意以下几点。

  • 要允许任何 IP 地址访问文件,请省略 IpAddress 参数。

  • 可以指定一个 IP 地址或一个 IP 地址范围。例如,如果客户端的 IP 地址在两个独立范围之一的范围内,您不能设置策略以允许访问。

  • 要允许从单个 IP 地址访问,可指定:

    "IPv4 IP address/32"

  • 必须采用标准 IPv4 CIDR 格式指定 IP 地址范围 (例如,192.0.2.0/24)。有关详细信息,请转至 RFC4632,无级域间路由(CIDR): 互联网地址分配和汇总计划http://tools.ietf.org/html/rfc4632.

    重要

    不支持 IPv6 格式的 IP 地址,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。

    如果使用包含 IpAddress 的自定义策略,请勿为分配启用 IPv6。如果希望通过 IP 地址限制对某些内容的访问并支持其他内容的 IPv6 请求,可以创建两个分配。有关更多信息,请参阅 启用 IPv6 主题中的 您创建或更新分配时指定的值

使用自定义策略的签名 Cookie 的示例策略声明

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

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

有关更多信息,请参阅 在使用自定义策略的签名 Cookie 的策略声明中指定的值。)

政策声明示例: 从一系列IP地址访问一个文件

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

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

政策声明示例: 从一系列IP地址访问目录中的所有文件

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

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

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

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

政策声明示例: 从一个IP地址访问与密钥对ID相关联的所有文件

以下示例自定义策略允许为与任何分配相关联的任何文件设置签名 Cookie,如 Resource 参数中的 * 通配符所指示。用户必须使用IP地址 192.0.2.10/32...(价值 192.0.2.10/32 在CIDR标记中,指单个IP地址, 192.0.2.10.)这些文件仅可从2013年1月1日上午10:00开始,直至2013年1月2日上午10:00UTC:

{ "Statement": [ { "Resource":"http://*", "Condition":{ "IpAddress":{"AWS:SourceIp":"192.0.2.10/32"}, "DateGreaterThan":{"AWS:EpochTime":1357034400}, "DateLessThan":{"AWS:EpochTime":1357120800} } } ] }

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

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

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

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

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

有关额外信息以及如何哈希、签署及编码策略声明的示例,请参阅:

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

  1. 使用 SHA-1 哈希函数和 RSA 对在为使用自定义策略的签名 URL 创建策略声明过程中创建的 JSON 策略声明进行哈希处理并签署。使用不再包含空格但尚未进行 Base64 编码的策略声明版本。

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

    注意

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

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

  3. 使用 MIME Base64 编码对字符串进行 Base64 编码。有关详细信息,请参阅 第6.8节,Base64内容传输编码RFC2045、MIME(多用途互联网邮件扩展)第一部分: 互联网消息机构的格式.

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

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

    +

    - (连字符)

    =

    _(下划线)

    /

    ~(波浪字符)

  5. 将结果值包含到 Set-Cookie 名称值对的 CloudFront-Signature= 标头中,并返回使用自定义策略设置签名 Cookie以添加 Set-CookieCloudFront-Key-Pair-Id 标头。