使用自定义策略设置签名 Cookie
要使用自定义策略设置签名 Cookie,请完成以下步骤。
使用自定义策略设置签名 Cookie
-
如果您使用 .NET 和 Java 创建签名 URL,而且,如果您尚未将密钥对私有密钥的格式从默认 .pem 格式重新设置为与 .NET 和 Java 兼容的格式,那么现在就开始设置吧。有关更多信息,请参阅 重新设置私有密钥的格式(仅限 .NET 和 Java)。
-
将应用程序编程为向批准的查看器发送三个
Set-Cookie
标头。您之所以需要三个Set-Cookie
标头,是因为每个Set-Cookie
标头只能包含一个名称-值对,而 CloudFront 签名 Cookie 需要三个名称-值对。名称值对为:CloudFront-Policy
、CloudFront-Signature
和CloudFront-Key-Pair-Id
。在用户首次请求您希望控制访问权的文件时,查看器中必须包含这些值。注意
一般情况下,建议排除
Expires
和Max-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 的签署人。
- (可选)
自定义策略的 Set-Cookie
标头示例
请参阅以下 Set-Cookie
标头对示例。
如果您希望在 URL 中使用备用域名(如 example.com),则无论您是否指定 Domain
属性,都必须向分配中添加备用域名。有关更多信息,请参阅 备用域名 (CNAME)主题中的 分配设置参考。
例 示例 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
例 示例 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
例 示例 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
例 示例 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
为使用自定义策略的签名 Cookie 创建策略声明
要创建自定义策略的策略声明,请完成以下步骤。有关以各种方式控制访问文件的一些示例策略声明,请参阅使用自定义策略的签名 Cookie 的示例策略声明。
为使用自定义策略的签名 Cookie 创建策略声明
-
使用以下 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 的策略声明中指定的值。
-
-
删除策略声明中的所有空格(包括制表符和换行符)。您可能需要在应用程序代码的字符串中包括换码符。
-
使用 MIME Base64 编码对策略声明进行 Base64 编码。有关更多信息,请参阅 RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies 中的 Section 6.8, Base64 Content-Transfer-Encoding
。 -
用有效的字符替换 URL 查询字符串中的无效字符。下表列出了无效和有效字符。
替换这些无效字符 使用这些有效字符 +
- (连字符)
=
_(下划线)
/
~(波浪字符)
-
将结果值包含在
Set-Cookie
标头的CloudFront-Policy=
之后。 -
通过对策略声明进行哈希、签署及 Base64 编码处理,为
CloudFront-Signature
的Set-Cookie
标头创建签名。有关更多信息,请参阅 为使用自定义策略的签名 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,无类别域间路由 (CIDR):互联网地址分配和聚合计划》,网址为 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 中的以下示例自定义策略指定用户可从范围 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": 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 创建签名
-
使用 SHA-1 哈希函数和 RSA 对在为使用自定义策略的签名 URL 创建策略声明过程中创建的 JSON 策略声明进行哈希处理并签署。使用不再包含空格但尚未进行 Base64 编码的策略声明版本。
对于哈希函数所需的私有密钥,请使用其公有密钥位于分配的活动可信密钥组中的私有密钥。
注意
您用于哈希及签署策略声明的方法取决于您的编程语言和平台。有关代码示例,请参阅 为签名 URL 创建签名的代码示例。
-
删除经过哈希处理并签署的字符串中的空格(包括制表符和换行符)。
-
使用 MIME Base64 编码对字符串进行 Base64 编码。有关更多信息,请参阅 RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies 中的 Section 6.8, Base64 Content-Transfer-Encoding
。 -
用有效的字符替换 URL 查询字符串中的无效字符。下表列出了无效和有效字符。
替换这些无效字符 使用这些有效字符 +
- (连字符)
=
_(下划线)
/
~(波浪字符)
-
将结果值包含到
Set-Cookie
名称值对的CloudFront-Signature=
标头中,并返回使用自定义策略设置签名 Cookie以添加Set-Cookie
的CloudFront-Key-Pair-Id
标头。