

# 指定可以创建签名 URL 和签名 Cookie 的签署人
<a name="private-content-trusted-signers"></a>

**Topics**
+ [在可信密钥组（推荐）和Amazon Web Services 账户之间进行选择](#choosing-key-groups-or-AWS-accounts)
+ [为签署人创建密钥对](#private-content-creating-cloudfront-key-pairs)
+ [重新设置私有密钥的格式（仅限 .NET 和 Java）](#private-content-reformatting-private-key)
+ [将签署人添加到分配](#private-content-adding-trusted-signers)
+ [轮换密钥对](#private-content-rotating-key-pairs)

要创建签名 URL 或签名 Cookie，您需要一个*签署人*。签署人可以是您在 CloudFront 中创建的受信密钥组，也可以是包含 CloudFront 密钥对的 Amazon 账户。建议您使用带有签名 URL 和签名 Cookie 的可信密钥组。有关更多信息，请参阅 [在可信密钥组（推荐）和Amazon Web Services 账户之间进行选择](#choosing-key-groups-or-AWS-accounts)。

签署人有两个目的：
+ 只要将可信签署人添加到分配中，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. 决定是使用可信密钥组还是Amazon Web Services 账户作为签署人。我们建议使用可信密钥组。有关更多信息，请参阅 [在可信密钥组（推荐）和Amazon Web Services 账户之间进行选择](#choosing-key-groups-or-AWS-accounts)。

1. 对于您在步骤 1 中选择的签署人，创建一个公有/私有密钥对。有关更多信息，请参阅 [为签署人创建密钥对](#private-content-creating-cloudfront-key-pairs)。

1. 如果使用 .NET 或 Java 创建签名 URL 或签名 Cookie，请重新设置私有密钥的格式。有关更多信息，请参阅 [重新设置私有密钥的格式（仅限 .NET 和 Java）](#private-content-reformatting-private-key)。

1. 在要为其创建签名 URL 或签名 Cookie 的分配中，指定签署人。有关更多信息，请参阅 [将签署人添加到分配](#private-content-adding-trusted-signers)。

## 在可信密钥组（推荐）和Amazon Web Services 账户之间进行选择
<a name="choosing-key-groups-or-AWS-accounts"></a>

要使用签名 URL 或签名 Cookie，您需要一个*签署人*。签署人可以是您在 CloudFront 中创建的可信密钥组，也可以是包含 CloudFront 密钥对的Amazon Web Services 账户。建议您使用可信密钥组，原因如下：
+ 对于 CloudFront 密钥组，您无需使用 Amazon 账户 root 用户来管理 CloudFront 签名 URL 和签名 Cookie 的公有密钥。[Amazon最佳实践](https://docs.amazonaws.cn/general/latest/gr/root-vs-iam.html#aws_tasks-that-require-root)建议您在不必使用 root 用户时就不要使用。
+ 借助 CloudFront 密钥组，您可以使用 CloudFront API 管理公有密钥、密钥组和可信签署人。您可以使用 API 自动执行密钥创建和密钥轮换。当您使用 Amazon root 用户时，您必须使用 Amazon Web Services 管理控制台 管理 CloudFront 密钥对，因此您无法自动执行此过程。
+ 由于您可以使用 CloudFront API 管理密钥组，因此还可以使用 Amazon Identity and Access Management (IAM) 权限策略来限制允许不同用户执行的操作。例如，您可以允许用户上传公有密钥，但不能删除它们。或者，您可以允许用户删除公有密钥，但只有在满足某些条件时才能删除公有密钥，例如使用多重验证、从特定网络发送请求或在特定日期和时间范围内发送请求。
+ 通过 CloudFront 密钥组，您可以将更多的公有密钥与您的 CloudFront 分配关联，从而在如何使用和管理公有密钥方面提供更大的灵活性。默认情况下，您最多可以将四个密钥组与单一分配关联，并且一个密钥组中最多可以有五个公有密钥。

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

## 为签署人创建密钥对
<a name="private-content-creating-cloudfront-key-pairs"></a>

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

创建密钥对的方式取决于您是使用可信密钥组作为签署人（推荐），还是使用 CloudFront 密钥对。有关更多信息，请参阅以下部分。您创建的密钥对必须满足以下要求：
+ 它必须是 SSH-2 RSA 2048 或 ECDSA 256 密钥对。
+ 它必须采用 base64 编码的 PEM 格式。

为了帮助保护您的应用程序，建议您定期轮换密钥对。有关更多信息，请参阅 [轮换密钥对](#private-content-rotating-key-pairs)。

### 为可信密钥组创建密钥对（推荐）
<a name="create-key-pair-and-key-group"></a>

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

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

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

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

有关更多信息，请参阅以下流程。<a name="private-content-uploading-cloudfront-public-key-procedure"></a>

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

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

     ```
     openssl genrsa -out private_key.pem 2048
     ```
   + 下面的示例命令使用 OpenSSL 通过 `prime256v1` 曲线生成一个 ECDSA 密钥对，并保存到名为 `private_key.pem` 的文件中。

     ```
     openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
     ```

1. 生成的文件同时包含公有密钥和私有密钥。以下示例命令从名为 `private_key.pem` 的文件中提取公有密钥。

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

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

**将公有密钥上传到 CloudFront**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在导航菜单中，选择**公有密钥**。

1. 选择**创建公有密钥**。

1. 在**创建公有密钥**窗口中，执行以下操作：

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

   1. 对于**密钥值**，粘贴公有密钥。如果按照上述过程中的步骤操作，则公有密钥位于名为 `public_key.pem` 的文件中。要复制和粘贴公有密钥的内容，您可以：
      + 在 macOS 或 Linux 命令行上使用 **cat** 命令，如下所示：

        ```
        cat public_key.pem
        ```

        复制该命令的输出，然后将其粘贴到**密钥值**字段中。
      + 使用记事本（在 Windows 上）或 TextEdit（在 macOS 上）等明文编辑器打开 `public_key.pem` 文件。复制文件的内容，然后将其粘贴到**密钥值**字段中。

   1. （可选）对于**注释**，请添加注释以描述公有密钥。

   完成后，选择**添加**。

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

**将公有密钥添加到密钥组**

1. 通过 打开 CloudFront 控制台[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)

1. 在导航菜单中，选择**密钥组**。

1. 选择**添加密钥组**。

1. 在**创建密钥组**页上，执行以下操作：

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

   1. （可选）对于**注释**，键入注释以描述密钥组。

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

1. 选择**创建密钥组**。

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

### 创建 CloudFront 密钥对（不建议这样做，需要Amazon Web Services 账户根用户权限）
<a name="create-key-pair-aws-account"></a>

**重要**  
建议您为可信密钥组创建公有密钥，而不是执行以下步骤。有关为签名 URL 和签名 Cookie 创建公有密钥的推荐方法，请参阅[为可信密钥组创建密钥对（推荐）](#create-key-pair-and-key-group)。

您可以通过以下方式创建 CloudFront 密钥对：
+ 在 Amazon Web Services 管理控制台 中创建密钥对并下载私有密钥。请参见以下过程。
+ 通过使用诸如 OpenSSL 等应用程序创建 RSA 密钥对，然后将公有密钥上传到 Amazon Web Services 管理控制台。有关创建 RSA 密钥对的更多信息，请参阅[为可信密钥组创建密钥对（推荐）](#create-key-pair-and-key-group)。<a name="private-content-creating-cloudfront-key-pairs-procedure"></a>

**要在 中创建 CloudFront 密钥对Amazon Web Services 管理控制台**

1. 使用 Amazon 账户 root 用户登录 Amazon Web Services 管理控制台。
**重要**  
IAM 用户无法创建 CloudFront 密钥对。必须使用 root 用户凭证登录才能创建密钥对。

1. 选择您的账户名称，然后选择**我的安全凭证**。

1. 选择 **CloudFront 密钥对**。

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

1. 选择**创建新的密钥对**。
**注意**  
您还可以选择创建自己的密钥对并上传公钥。CloudFront 密钥对支持 1024、2048 或 4096 位密钥。

1. 在**创建密钥对**对话框中，选择**下载私有密钥文件**，然后将该文件保存在您的计算机上。
**重要**  
将 CloudFront 密钥对的私有密钥保存在安全的位置，并设置对文件的权限，以便只有所需的管理员可读取它。如果某人获取您的私有密钥，则他们可以生成有效的签名 URL 和签名 Cookie，并下载您的内容。您不能再次获得私有密钥，因此，如果您丢失或删除了它，则必须创建新的 CloudFront 密钥对。

1. 记录密钥对的密钥对 ID。(在 Amazon Web Services 管理控制台 中，这称为**访问密钥 ID**。) 创建签名 URL 或签名 Cookie 时会用到它。

## 重新设置私有密钥的格式（仅限 .NET 和 Java）
<a name="private-content-reformatting-private-key"></a>

如果使用 .NET 或 Java 创建签名 URL 或签名 Cookie，则不能以默认 PEM 格式使用密钥对中的私有密钥来创建签名。而是执行以下操作：
+ **.NET 框架** – 将私有密钥转换成 .NET 框架使用的 XML 格式。可使用多种工具。
+ **Java** – 将私有密钥转换成 DER 格式。执行此操作的一种方法是使用以下 OpenSSL 命令。在以下命令中，`private_key.pem` 是包含 PEM 格式的私有密钥的文件的名称，`private_key.der` 是运行该命令后包含 DER 格式的私有密钥的文件的名称。

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

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

## 将签署人添加到分配
<a name="private-content-adding-trusted-signers"></a>

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

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

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

**重要**  
在将签署人添加到分配之前，请执行以下操作：  
仔细定义缓存行为中的路径模式和缓存行为的顺序，以便不会授予用户意外访问您的内容的权限或阻止他们访问您希望每个人都可用的内容。  
例如，假设请求匹配两个缓存行为的路径模式。第一个缓存行为不要求签名 URL 或签名 Cookie，而第二个缓存行为有此要求。这种情况下，用户不需使用签名 URL 或签名 Cookie 即可访问文件，因为 CloudFront 处理的缓存行为与第一个相符的条件相关联。  
更多有关路径模式的信息，请参阅 [路径模式](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern)。
对于您已经用于分发内容的分配，请确保您已准备好开始生成签名 URL 和签名 Cookie，然后再添加签署人。添加签署人时，CloudFront 拒绝不包含有效签名 URL 或签名 Cookie 的请求。

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

------
#### [ Console ]

以下步骤显示如何将可信密钥组添加为签署人。您也可以将Amazon Web Services 账户添加为可信签署人，但不建议这样做。<a name="private-content-adding-trusted-signers-console-procedure"></a>

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

1. 记录要用作可信签署人的密钥组的密钥组 ID。有关更多信息，请参阅[为可信密钥组创建密钥对（推荐）](#create-key-pair-and-key-group)。

1. 通过 打开 CloudFront 控制台[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)

1. 选择要使用签名 URL 或签名 Cookie 保护其文件的分配。
**注意**  
要将签署人添加到新分配，请在创建分配时指定在步骤 6 中描述的相同设置。

1. 选择 **Behaviors** 选项卡。

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

1. 在**编辑行为**页上，执行以下操作：

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

   1. 对于**可信密钥组或可信签署人**，选择**可信密钥组**。

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

1. 选择**是，编辑**以更新缓存行为。

------
#### [ API ]

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

您也可以将Amazon Web Services 账户添加为可信签署人，但不建议这样做。

请参阅《Amazon CloudFront API 参考》**中的以下主题：
+ **更新现有的分配** – [UpdateDistribution](https://docs.amazonaws.cn/cloudfront/latest/APIReference/API_UpdateDistribution.html)
+ **创建新的分配** – [CreateDistribution](https://docs.amazonaws.cn/cloudfront/latest/APIReference/API_CreateDistribution.html)

------

## 轮换密钥对
<a name="private-content-rotating-key-pairs"></a>

建议您定期轮换（更改）签名 URL 和签名 Cookie 的密钥对。要轮换用于创建签名 URL 或签名 Cookie 的密钥对，而不使尚未过期的 URL 或 Cookie 失效，请执行以下任务：

1. 创建新的密钥对，然后将公有密钥添加到密钥组。有关更多信息，请参阅 [为可信密钥组创建密钥对（推荐）](#create-key-pair-and-key-group)。

1. 如果您在上一步骤中创建了新密钥组，请[将密钥组作为签署人添加到分配中](#private-content-adding-trusted-signers)。
**重要**  
不要从密钥组中删除任何现有公有密钥，也不要从分配中删除任何密钥组。只添加新的密钥组。

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

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