指定可以创建签名 URL 和签名 Cookie 的签署人 - Amazon CloudFront
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

指定可以创建签名 URL 和签名 Cookie 的签署人

要创建签名 URL 或签名 Cookie,您需要一个签署人。签署人可以是您在 CloudFront 中创建的受信密钥组,也可以是包含 CloudFront 密钥对的 AWS 账户。我们建议您使用带有签名 URL 和签名 Cookie 的可信密钥组。有关更多信息,请参阅在可信密钥组(推荐)和 AWS 账户之间进行选择

签署人有两个目的:

  • 只要将可信签署人添加到分配中,CloudFront 就会开始要求查看器使用签名 URL 或签名 Cookie 访问文件。

  • 创建签名 URL 或签名 Cookie 时,使用来自签署人的密钥对中的私有密钥来签署 URL 或 Cookie 的一部分。当有人请求受限文件时,CloudFront 会将 URL 或 Cookie 中的签名与未签名 URL 或 Cookie 进行比较,以确认其未被篡改。CloudFront 还会验证 URL 或 Cookie 是否有效,即,未超过过期日期和时间。

指定签署人时,还可以通过将签署人添加到缓存行为,间接指定需要签名 URL 或签名 Cookie 的文件。如果分配只有一个缓存行为,则查看器必须使用签名 URL 或签名 Cookie 访问分配中的任何文件。如果创建了多个缓存行为,并将签署人添加到某些缓存行为而没有添加到其他缓存行为,则可要求查看器使用签名 URL 或签名 Cookie 访问某些文件而不是其他文件。

要指定允许创建签名 URL 或签名 Cookie 的签署人(私有密钥)并将签署人添加到 CloudFront 分配中,请执行以下任务:

  1. 决定是使用可信密钥组还是 AWS 账户作为签署人。我们建议使用可信密钥组。有关更多信息,请参阅 在可信密钥组(推荐)和 AWS 账户之间进行选择

  2. 对于您在步骤 1 中选择的签署人,创建一个公有/私有密钥对。有关更多信息,请参阅 为签署人创建密钥对

  3. 如果使用 .NET 或 Java 创建签名 URL 或签名 Cookie,请重新设置私有密钥的格式。有关更多信息,请参阅 重新设置密钥对的格式(仅限 .NET 和 Java)。

  4. 在要为其创建签名 URL 或签名 Cookie 的分配中,指定签署人。有关更多信息,请参阅 将签署人添加到分配

在可信密钥组(推荐)和 AWS 账户之间进行选择

要使用签名 URL 或签名 Cookie,您需要一个签署人。签署人可以是您在 CloudFront 中创建的受信密钥组,也可以是包含 CloudFront 密钥对的 AWS 账户。我们建议您使用可信密钥组,原因如下:

  • 使用 CloudFront 密钥组,您无需使用 AWS 账户 root 用户管理 CloudFront 签名 URL 和签名 Cookie 的公有密钥。AWS 最佳实践建议您如非必要,则不要使用 root 用户。

  • 借助 CloudFront 密钥组,您可以使用 CloudFront API 管理公有密钥、密钥组和可信签署人。您可以使用 API 自动执行密钥创建和密钥轮换。当您使用 AWS root 用户时,必须使用 AWS 管理控制台管理 CloudFront 密钥对,因此无法自动执行此过程。

  • 由于您可以使用 CloudFront API 管理密钥组,因此还可以使用 AWS Identity and Access Management (IAM) 权限策略来限制允许不同用户执行的操作。例如,您可以允许用户上传公有密钥,但不能删除它们。或者,您可以允许用户删除公有密钥,但只有在满足某些条件时才能删除公有密钥,例如使用多重验证、从特定网络发送请求或在特定日期和时间范围内发送请求。

    当您使用 AWS 账户 root 用户管理 CloudFront 密钥对时,无法限制 root 用户可以执行的操作,也无法限制 root 用户可以执行这些操作的条件。您无法将 IAM 权限策略应用于 root 用户,这就是 AWS 最佳实践建议不要使用 root 用户的原因之一。

  • 通过 CloudFront 密钥组,您可以将更多的公有密钥与您的 CloudFront 分配关联,从而在如何使用和管理公有密钥方面提供更大的灵活性。默认情况下,您最多可以将四个密钥组与单一分配关联,并且一个密钥组中最多可以有五个公有密钥。

    当您使用 root 用户管理 CloudFront 密钥对时,每个 AWS 账户最多只能拥有两个有效的 CloudFront 密钥对。

为签署人创建密钥对

您用于创建 CloudFront 签名 URL 或签名 Cookie 的每个签署人都必须具有公有密钥/私有密钥对。签署人使用其私有密钥对 URL 或 Cookie 进行签名,而 CloudFront 使用公有密钥验证签名。

创建密钥对的方式取决于您是使用可信密钥组作为签署人(推荐),还是使用 CloudFront 密钥对。有关更多信息,请参阅以下部分。您创建的密钥对必须满足以下要求:

  • 它必须是 SSH-2 RSA 密钥对。

  • 它必须采用 base64 编码的 PEM 格式。

  • 它必须是 1024、2048 或 4096 位的密钥对。

为了帮助保护您的应用程序,我们建议您定期轮换密钥对。有关更多信息,请参阅 轮换密钥对

为可信密钥组创建密钥对(推荐)

要为可信密钥组创建密钥对,请执行以下步骤:

  1. 创建公有/私有密钥对。

  2. 将公有密钥上传到 CloudFront。

  3. 将公有密钥添加到 CloudFront 密钥组。

有关更多信息,请参阅以下流程。

创建密钥对

注意

以下步骤使用 OpenSSL 作为一种密钥对创建方法的示例。还有许多其他方法可以创建 RSA 密钥对。

  1. 以下示例命令使用 OpenSSL 生成长度为 2048 位的 RSA 密钥对,并将其保存到名为 private_key.pem 的文件中。

    openssl genrsa -out private_key.pem 2048
  2. 生成的文件同时包含公有密钥和私有密钥。以下示例命令从名为 private_key.pem 的文件中提取公有密钥。

    openssl rsa -pubout -in private_key.pem -out public_key.pem

    您稍后在以下过程中上传公有密钥(在 public_key.pem 文件中)。

将公有密钥上传到 CloudFront

  1. 登录到 AWS 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/

  2. 在导航菜单中,选择公有密钥

  3. 选择 Add public key (添加公有密钥)

  4. 添加公有密钥窗口中,执行以下操作:

    1. 对于密钥名称,键入一个名称以标识公有密钥。

    2. 对于密钥值,粘贴公有密钥。如果按照上述过程中的步骤操作,则公有密钥位于名为 public_key.pem 的文件中。要复制和粘贴公有密钥的内容,您可以:

      • 在 macOS 或 Linux 命令行上使用 cat 命令,如下所示:

        cat public_key.pem

        复制该命令的输出,然后将其粘贴到密钥值字段中。

      • 使用记事本(在 Windows 上)或 TextEdit(在 macOS 上)等明文编辑器打开 public_key.pem 文件。复制文件的内容,然后将其粘贴到密钥值字段中。

    3. (可选)对于注释,请添加注释以描述公有密钥。

    完成后,选择添加

  5. 记录公有密钥 ID。稍后在创建签名 URL 或签名 Cookie 时使用它作为 Key-Pair-Id 字段的值。

将公有密钥添加到密钥组

  1. 通过以下网址打开 CloudFront 控制台: https://console.aws.amazon.com/cloudfront/

  2. 在导航菜单中,选择密钥组

  3. 选择添加密钥组

  4. 创建密钥组页上,执行以下操作:

    1. 对于密钥组名称,键入一个名称以标识密钥组。

    2. (可选)对于注释,键入注释以描述密钥组。

    3. 对于公有密钥,选择要添加到密钥组的公有密钥,然后选择添加。对要添加到密钥组的每个公有密钥重复此步骤。

  5. 选择创建密钥组

  6. 记录密钥组名称。稍后可以使用它将密钥组与 CloudFront 分配中的缓存行为相关联。(在 CloudFront API 中,您使用密钥组 ID 将密钥组与缓存行为相关联。)

重要

我们建议您为可信密钥组创建公有密钥,而不是执行以下步骤。有关为签名 URL 和签名 Cookie 创建公有密钥的推荐方法,请参阅为可信密钥组创建密钥对(推荐)

您可以通过以下方式创建 CloudFront 密钥对:

  • 在 AWS 管理控制台中创建密钥对并下载私有密钥。请参见以下过程。

  • 通过使用诸如 OpenSSL 等应用程序创建 RSA 密钥对,然后将公有密钥上传到 AWS 管理控制台。有关创建 RSA 密钥对的更多信息,请参阅为可信密钥组创建密钥对(推荐)

在 AWS 管理控制台中创建 CloudFront 密钥对

  1. 使用 AWS 账户 root 用户的凭证登录 AWS 管理控制台。

    重要

    IAM 用户无法创建 CloudFront 密钥对。必须使用 root 用户凭证登录才能创建密钥对。

  2. 选择您的账户名称,然后选择我的安全凭证

  3. 选择 CloudFront 密钥对

  4. 确认没有或仅拥有一个有效的密钥对。如果已有两个有效的密钥对,则无法创建密钥对。

  5. 选择创建新的密钥对

  6. 创建密钥对对话框中,选择下载私有密钥文件,然后将该文件保存在您的计算机上。

    重要

    将 CloudFront 密钥对的私有密钥保存在安全的位置,并设置对文件的权限,以便只有所需的管理员可读取它。如果某人获取您的私有密钥,则他们可以生成有效的签名 URL 和签名 Cookie,并下载您的内容。您不能再次获得私有密钥,因此,如果您丢失或删除了它,则必须创建新的 CloudFront 密钥对。

  7. 记录密钥对的密钥对 ID。(在 AWS 管理控制台中,这称为访问密钥 ID。) 创建签名 URL 或签名 Cookie 时会用到它。

重新设置密钥对的格式(仅限 .NET 和 Java)。

如果使用 .NET 或 Java 创建签名 URL 或签名 Cookie,则不能以默认 PEM 格式使用密钥对中的私有密钥来创建签名。而是执行以下操作:

  • .NET 框架 – 将私有密钥转换成 .NET 框架使用的 XML 格式。可使用多种工具。

  • Java – 将私有密钥转换成 DER 格式。执行此操作的一种方法是使用以下 OpenSSL 命令。在以下命令中,private_key.pem 是包含 PEM 格式的私有密钥的文件的名称,private_key.der 是运行该命令后包含 DERR 格式的私有密钥的文件的名称。

    openssl pkcs8 -topk8 -nocrypt -in private_key.pem -inform PEM -out private_key.der -outform DER

    要确保编码器正常工作,将 Bouncy Castle Java 加密术 API 的 JAR 添加到您的项目中,然后添加 Bouncy Castle 提供商。

将签署人添加到分配

签署人是可以为分配创建签名 URL 和签名 Cookie 的可信密钥组(推荐)或 CloudFront 密钥对。要在 CloudFront 分配中使用签名 URL 或签名 Cookie,您必须指定签署人。

签署人与缓存行为相关联。这样,您就可以要求对同一分配中的某些文件使用签名 URL 或签名 Cookie,对另一些文件则不使用。仅对于与相应缓存行为关联的文件,分配才需要签名 URL 或 Cookie。

同样,签署人只能为与相应缓存行为相关联的文件签署 URL 或 Cookie。例如,如果您有两个签署人,他们分别针对两个不同的缓存行为,那么这两个签署人均不能为与另一个缓存行为相关联的文件创建签名 URL 或 Cookie。

重要

在将签署人添加到分配之前,请执行以下操作:

  • 仔细定义缓存行为中的路径模式和缓存行为的顺序,以便不会授予用户意外访问您的内容的权限或阻止他们访问您希望每个人都可用的内容。

    例如,假设请求匹配两个缓存行为的路径模式。第一个缓存行为不要求签名 URL 或签名 Cookie,而第二个缓存行为有此要求。这种情况下,用户不需使用签名 URL 或签名 Cookie 即可访问文件,因为 CloudFront 处理的缓存行为与第一个相符的条件相关联。

    更多有关路径模式的信息,请参阅 路径模式

  • 对于您已经用于分发内容的分配,请确保您已准备好开始生成签名 URL 和签名 Cookie,然后再添加签署人。添加签署人时,CloudFront 拒绝不包含有效签名 URL 或签名 Cookie 的请求。

您可以使用 CloudFront 控制台或 CloudFront API 将签名者添加到您的分配中。

使用 CloudFront 控制台将签署人添加到分配

以下步骤显示如何将可信密钥组添加为签署人。也可以将 AWS 账户添加为可信签署人,但不建议这样做。

使用控制台将签署人添加到分配

  1. 记录要用作可信签署人的密钥组的密钥组 ID。有关更多信息,请参阅 为可信密钥组创建密钥对(推荐)

  2. 通过以下网址打开 CloudFront 控制台: https://console.aws.amazon.com/cloudfront/

  3. 选择要使用签名 URL 或签名 Cookie 保护其文件的分配。

    注意

    要将签署人添加到新分配,请在创建分配时指定在步骤 6 中描述的相同设置。

  4. 选择 Behaviors 选项卡。

  5. 选择其路径模式与要使用签名 URL 或签名 Cookie 保护的文件相匹配的缓存行为,然后选择编辑

  6. 编辑行为页上,执行以下操作:

    1. 对于限制查看器访问(使用签名 URL 或签名 Cookie),选择

    2. 对于可信密钥组或可信签署人,选择可信密钥组

    3. 对于可信密钥组,选择要添加的密钥组,然后选择添加。如果要添加多个密钥组,请重复此操作。

  7. 选择是,编辑以更新缓存行为。

使用 CloudFront 控制台将签署人添加到分配

您可以使用 CloudFront API 将可信密钥组添加为签署人。您可以将签署人添加到现有分配或新分配。在这两种情况下,在 TrustedKeyGroups 元素中指定适用的值。

也可以将 AWS 账户添加为可信签署人,但不建议这样做。

请参阅《Amazon CloudFront API 参考》中的以下主题:

轮换密钥对

我们建议您定期轮换(更改)签名 URL 和签名 Cookie 的密钥对。要轮换用于创建签名 URL 或签名 Cookie 的密钥对,而不使尚未过期的 URL 或 Cookie 失效,请执行以下任务:

  1. 创建新的密钥对,然后将公有密钥添加到密钥组。有关更多信息,请参阅 为可信密钥组创建密钥对(推荐)

  2. 如果您在上一步骤中创建了新密钥组,请将密钥组作为签署人添加到分配中

    重要

    不要从密钥组中删除任何现有公有密钥,也不要从分配中删除任何密钥组。只添加新的密钥组。

  3. 更新您的应用程序,以使用新密钥对中的私有密钥创建签名。确认使用新私有密钥签署的签名 URL 或 Cookie 有效。

  4. 等待使用之前的私有密钥对签名的 URL 或 Cookie 中的过期日期已过。然后,从密钥组中删除旧公有密钥。如果您在步骤 2 中创建了新的密钥组,请从分配中删除旧密钥组。