使用自定义策略创建签名 URL
要使用自定义策略创建签名 URL,请执行以下步骤。
要使用自定义策略创建签名 URL
-
如果您使用 .NET 和 Java 创建签名 URL,而且,如果您尚未将密钥对私有密钥的格式从默认 .pem 格式重新设置为与 .NET 和 Java 兼容的格式,那么现在就开始设置吧。有关更多信息,请参阅重新设置密钥对的格式(仅限 .NET 和 Java)。。
-
按指定顺序将下列值串连在一起并删除各部分之间的空格(包括制表符和换行符)。您可能需要在应用程序代码的字符串中包括换码符。所有值都有一个 String 类型。在后面的两个示例中,每个部分是按编号 (
) 键入的。
-
文件的基本 URL
-
基本 URL 是您将用于访问文件的 CloudFront URL,如果您不使用签名 URL,包括您自己的查询字符串参数(如果有)。有关适用于分配的 URL 格式的更多信息,请参阅在 CloudFront 中自定义文件的 URL 格式。
以下示例显示了您为分配指定的值。
-
以下 CloudFront URL 适用于分配中的图像文件(使用 CloudFront 域名)。请注意,
image.jpg
是在images
目录中。URL 中文件的路径必须与您的 HTTP 服务器或 Amazon S3 存储桶中文件的路径匹配。https://d111111abcdef8.cloudfront.net/images/image.jpg
-
以下 CloudFront URL 包含查询字符串:
https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large
-
以下 CloudFront URL 适用于分配中的映像文件。两者都使用备用域名,第二个包括查询字符串:
https://www.example.com/images/image.jpg
https://www.example.com/images/image.jpg?color=red
-
以下 CloudFront URL 用于使用备用域名和 HTTPS 协议的分配中的映像文件:
https://www.example.com/images/image.jpg
-
-
?
-
? 表示查询字符串参数位于基本 URL 后面。即使您没有任何自己的查询字符串参数,也会包含 ?。
-
您的查询字符串参数(如果有)
& -
该值为可选项。如果您想添加自己的查询字符串参数,例如:
color=red&size=medium
则在 ?(请参阅
)之后以及
Policy
参数之前添加这些参数。在某些罕见情况下,可能需要将查询字符串参数放在Key-Pair-Id
之后。重要 您的参数不能命名为
Policy
、Signature
或Key-Pair-Id
。如果您添加自己的参数,请在每个参数后追加 &,包括最后一个参数。
-
Policy=
Base64 编码的策略声明版本
-
策略声明采用 JSON 格式,删除了空格,然后进行 Base64 编码。有关更多信息,请参阅为使用自定义策略的签名 URL 创建策略声明。
策略语句控制签名 URL 授予用户的访问权限。它包括文件的 URL、过期日期和时间、URL 生效的可选日期和时间、允许访问文件的可选 IP 地址或 IP 地址范围。
-
&Signature=
经过哈希处理和签名的策略声明版本
-
JSON 策略声明经过哈希处理、签署和 Base64 编码的版本。有关更多信息,请参阅为使用自定义策略的签名 URL 创建签名。
-
&Key-Pair-Id=
您用于生成签名的相应私有密钥的 CloudFront 公有密钥的公有密钥 ID
-
CloudFront 公有密钥的 ID,例如,
K2JCJMDEHXQW5F
。公有密钥 ID 告诉 CloudFront 要使用哪个公有密钥来验证签名的 URL。CloudFront 将比较签名中的信息与策略声明中的信息,以确认该 URL 没有被篡改。此公有密钥必须属于作为分配中可信签署人的密钥组。有关更多信息,请参阅指定可以创建签名 URL 和签名 Cookie 的签署人。
-
签名 URL 示例:
https://d111111abcdef8.cloudfront.net/image.jpg
?
color=red&size=medium&
Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA
6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ
29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiI
yMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQ
VdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp
7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo
&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~
-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmat
EXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6
&Key-Pair-Id=K2JCJMDEHXQW5F
为使用自定义策略的签名 URL 创建策略声明
要创建自定义策略的策略声明,请执行以下步骤。有关以各种方式控制访问文件的一些示例策略声明,请参阅使用自定义策略的签名 URL 的示例策略声明。
为使用自定义策略的签名 URL 创建策略声明
-
使用以下 JSON 格式构建策略声明。有关更多信息,请参阅在使用自定义策略的签名 URL 的策略声明中指定的值。
{ "Statement": [ { "Resource": "URL or stream name 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
值的信息,请参阅在使用自定义策略的签名 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 查询字符串中的无效字符。下表列出了无效和有效字符。
替换这些无效字符 使用这些有效字符 +
- (连字符)
=
_(下划线)
/
~(波浪字符)
-
将结果值附在签名 URL
Policy=
之后。 -
通过对策略声明进行哈希、签署及 Base64 编码处理,创建签名 URL 的签名。有关更多信息,请参阅为使用自定义策略的签名 URL 创建签名。
在使用自定义策略的签名 URL 的策略声明中指定的值
针对自定义策略创建策略声明时,请指定以下值。
- 资源
-
注意 只能为
Resource
指定一个值。包含查询字符串(如果有)的基本 URL,但不包括 CloudFront
Policy
、Signature
和Key-Pair-Id
参数,例如:https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes
重要 如果省略分配的 Resource 参数,用户将可以访问与用于创建签名 URL 的密钥对相关联的任何分配的所有关联文件。
请注意以下几点:
-
协议 – 该值必须以
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 的信息,请参阅 RFC 3339,Internet 上的日期和时间:时间戳,网址为 https://tools.ietf.org/html/rfc3339
。 例如,2013 年 1 月 1 日上午 10 点 UTC 转换为 Unix 时间格式就是 1357034400。
这是该
Condition
部分唯一需要的参数。CloudFront 需要此值,以防止用户拥有对象的永久访问权。有关更多信息,请参阅CloudFront 何时检查签名 URL 中的过期日期和时间?
- 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 主题中的 您创建或更新分配时指定的值。
-
使用自定义策略的签名 URL 的示例策略声明
以下示例策略声明显示了如何控制对特定文件、目录中的所有文件或与密钥对 ID 有关的所有文件的访问。这些示例也显示了如何控制来自单个 IP 地址或 IP 地址范围的访问,以及如何防止用户在指定日期和时间后使用签名 URL。
如果复制并粘贴其中的任何示例,请删除任何空格(包括制表符和换行符),将值替换为自己的值,并在右大括号 (}) 后面包含一个换行符。
有关更多信息,请参阅在使用自定义策略的签名 URL 的策略声明中指定的值。
示例策略声明:从 IP 地址范围访问一个文件
签名 URL 中的以下示例自定义策略指定用户可从范围 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
目录中的任何文件创建签名 URL,如 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 } } } ] }
您在其中使用此策略的每个签名 URL 包括确定特定文件的基本 URL,例如:
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
示例策略声明:从一个 IP 地址访问与密钥对 ID 有关的所有文件
以下示例自定义策略允许您为与任何分配有关的任何文件创建签名 URL,如 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 } } } ] }
您在其中使用此策略的每个签名 URL 包括确定特定 CloudFront 分配中特定文件的基本 URL,例如:
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
签名 URL 还包括密钥对 ID,它必须与您在基本 URL 中指定的分配 (d111111abcdef8.cloudfront.net) 中的可信密钥组关联。
为使用自定义策略的签名 URL 创建签名
使用自定义策略的签名 URL 的签名是策略声明的哈希、签署及 Base64 编码版本。要为自定义策略创建签名,请完成以下步骤。
有关额外信息以及如何哈希、签署及编码策略声明的示例,请参阅:
选项 1:使用自定义策略创建签名
-
使用 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 查询字符串中的无效字符。下表列出了无效和有效字符。
替换这些无效字符 使用这些有效字符 +
- (连字符)
=
_(下划线)
/
~(波浪字符)
-
将结果值附在签名 URL 的
&Signature=
之后,然后返回 要使用自定义策略创建签名 URL,以完成签名 URL 的各部分的串连。