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

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

要使用自定义策略设置签名 Cookie,请完成以下步骤。

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

  2. 将应用程序编程为向批准的查看器发送三个 Set-Cookie 标头。您之所以需要三个 Set-Cookie 标头,是因为每个 Set-Cookie 标头只能包含一个名称值对,而 CloudFront 签名 Cookie 需要三个名称值对。名称值对为:CloudFront-PolicyCloudFront-SignatureCloudFront-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=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
    (可选)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,例如,K2JCJMDEHXQW5F。公有密钥 ID 告诉 CloudFront 要使用哪个公有密钥来验证签名的 URL。CloudFront 将比较签名中的信息与策略声明中的信息,以确认该 URL 没有被篡改。

    此公有密钥必须属于作为分配中可信签署人的密钥组。有关更多信息,请参阅指定可以创建签名 URL 和签名 Cookie 的签署人

在文件的 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=K2JCJMDEHXQW5F; 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=K2JCJMDEHXQW5F; 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部分中参数的顺序无关紧要。

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

  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-Policy= 之后。

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

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

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

资源

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

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

重要

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

只能为 Resource 指定一个值。

请注意以下几点:

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

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

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

    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 中的过期日期和时间?

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, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan,网址为 https://tools.ietf.org/html/rfc4632

    重要

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

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

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

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

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

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

示例策略声明:从 IP 地址范围访问一个文件

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

{ "Statement": [ { "Resource": "https://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": "https://d111111abcdef8.cloudfront.net/training/*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1357034400 } } } ] }

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

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

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

以下示例自定义策略允许为与任何分配相关联的任何文件设置签名 Cookie,如 Resource 参数中的 * 通配符所指示。用户必须使用 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": 1357034400 }, "DateLessThan": { "AWS:EpochTime": 1357120800 } } } ] }

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

https://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 编码。有关更多信息,请参阅 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= 标头中,并返回使用自定义策略设置签名 Cookie以添加 Set-CookieCloudFront-Key-Pair-Id 标头。