

# 信任存储和证书管理
<a name="trust-stores-certificate-management"></a>

要对 CloudFront 实施双向 TLS 身份验证，必须创建并配置信任存储。信任存储包含证书颁发机构（CA）证书，CloudFront 在身份验证过程中使用这些证书来验证客户端证书。

## 什么是信任存储？
<a name="what-is-trust-store"></a>

信任存储是 CA 证书的存储库，CloudFront 在双向 TLS 身份验证过程中使用这些证书来验证客户端证书。信任存储包含根证书和中间 CA 证书，这些证书构成了用于验证客户端证书的信任链。

在对 CloudFront 实施双向 TLS 时，信任存储会指定您可信任哪些证书颁发机构来颁发有效的客户端证书。在 TLS 握手过程中，CloudFront 会根据信任存储对每个客户端证书进行验证。客户端只有在提供了链接到信任存储中的某个 CA 的证书时，才能成功完成身份验证。

CloudFront 中的信任存储是账户级资源，可将其与多个分配关联。这可让您在整个 CloudFront 部署中保持一致的证书验证策略，并简化 CA 证书管理。

## 证书颁发机构支持
<a name="ca-support"></a>

CloudFront 支持由 Amazon 私有证书颁发机构和第三方私有证书颁发机构颁发的证书。这让您可以根据组织要求，灵活地选择使用现有证书基础设施或者利用 Amazon 托管证书服务。
+ **Amazon 私有证书颁发机构：**您可以使用由 Amazon 私有 CA 颁发的证书，这提供了托管私有证书颁发机构服务。此集成既简化了证书生命周期管理，又提供了与其他 Amazon 服务的无缝集成。
+ **第三方私有证书颁发机构：**您也可以使用来自现有的私有证书颁发机构基础设施的证书，包括企业 CA 或其他第三方证书提供商。这可让您在添加 CloudFront 的 mTLS 功能的同时保留当前证书管理流程。

## 证书要求和规范
<a name="certificate-requirements"></a>

信任存储对自身包含的 CA 证书有特定的要求：

### CA 证书格式要求
<a name="ca-cert-format-requirements"></a>
+ **格式：**PEM（隐私增强邮件）格式
+ **内容边界：**证书必须包含在 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 边界内
+ **注释：**必须以 \# 字符开头，并且不得包含任何 - 字符
+ **换行符：**证书之间不允许存在空行

### 支持的证书规范
<a name="supported-cert-specs"></a>
+ **证书类型：**X.509v3
+ **公有密钥类型：**
  + RSA 2048、RSA 3072、RSA 4096
  + ECDSA：secp256r1、secp384r1
+ **签名算法：**
  + 采用 RSA 的 SHA256、SHA384、SHA512
  + 采用 EC 的 SHA256、SHA384、SHA512
  + 采用 RSASSA-PSS 与 MGF1 的 SHA256、SHA384、SHA512

### 证书捆绑包格式示例
<a name="example-cert-bundle"></a>

多个证书（PEM 编码）：

```
# Root CA Certificate
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKoK/OvD/XqiMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTcwNzEyMTU0NzQ4WhcNMjcwNzEwMTU0NzQ4WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuuExKvY1xzHFylsHiuowqpmzs7rEcuuylOuEszpFp+BtXh0ZuEtts9LP
-----END CERTIFICATE-----
# Intermediate CA Certificate
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKoK/OvD/XqjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTcwNzEyMTU0NzQ4WhcNMjcwNzEwMTU0NzQ4WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuuExKvY1xzHFylsHiuowqpmzs7rEcuuylOuEszpFp+BtXh0ZuEtts9LP
-----END CERTIFICATE-----
```

## 创建信任存储
<a name="create-trust-store"></a>

在创建信任存储之前，您必须将 PEM 格式的 CA 证书捆绑包上传到 Amazon S3 存储桶。此证书捆绑包应包含验证客户端证书所需的所有受信任的根证书和中间 CA 证书。

在创建信任存储时，仅从 S3 中读取一次 CA 证书捆绑包。如果后续对 CA 证书捆绑包进行修改，则需手动更新信任存储。信任存储和 S3 CA 证书捆绑包之间不会保持同步。

### 先决条件
<a name="trust-store-prerequisites"></a>
+ 来自证书颁发机构（CA）的证书捆绑包已上传到 Amazon S3 存储桶
+ 创建 CloudFront 资源所需的权限

### 创建信任存储（控制台）
<a name="create-trust-store-console"></a>

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

1. 在导航窗格中，选择**信任存储**。

1. 选择**创建信任存储**。

1. 对于**信任存储名称**，输入信任存储的名称。

1. 对于**证书颁发机构（CA）捆绑包**，输入 PEM 格式的 CA 证书捆绑包的 Amazon S3 路径。

1. 选择**创建信任存储**。

### 创建信任存储（Amazon CLI）
<a name="create-trust-store-cli"></a>

```
aws cloudfront create-trust-store \
  --name MyTrustStore \
  --ca-certificates-bundle-source '{"CaCertificatesBundleS3Location":{"Bucket":"my-bucket","Key":"ca-bundle.pem","Region":"{{bucket-region}}"}}' \
  --tags Items=[{Key=Environment,Value=Production}]
```

## 将信任存储与分配关联
<a name="associate-trust-store"></a>

创建信任存储后，您必须将其与 CloudFront 分配关联来启用双向 TLS 身份验证。

### 先决条件
<a name="associate-prerequisites"></a>
+ 现有 CloudFront 分配，已启用仅 HTTPS 查看器协议策略并且禁用了 HTTP3 支持。

### 关联信任存储（控制台）
<a name="associate-trust-store-console"></a>

在 CloudFront 控制台中，可通过以下两个途径关联信任存储：信任存储详细信息页面或分配设置页面。

**通过信任存储详细信息页面关联信任存储：**

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

1. 在导航窗格中，选择**信任存储**。

1. 选择要关联的信任存储的名称。

1. 选择**关联到分配**。

1. 配置可用的查看器 mTLS 选项：
   + **客户端证书验证模式：**在“必需”模式和“可选”模式之间进行选择。在必需模式下，所有客户端都需要提供证书。在可选模式下，系统会对提供证书的客户端进行验证，而未提供证书的客户端也允许访问。
   + **公布信任存储 CA 名称：**选择在 TLS 握手过程中，是否向客户端公布信任存储中的 CA 名称。
   + **忽略证书到期日期：**选择是否允许使用到期证书建立连接（其他验证标准仍将适用）。
   + **连接函数：**可以关联一个可选的连接函数，来基于其他自定义标准允许/拒绝连接。

1. 选择要与信任存储关联的一个或多个分配。分配只有在禁用了 HTTP3 且采用仅 HTTPS 缓存行为后，才能够支持查看器 mTLS。

1. 选择**关联**。

**通过分配设置页面关联信任存储：**

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

1. 选择要关联的分配

1. 在**常规**选项卡下的**设置**容器中，选择右上角的**编辑**

1. 向下滚动到页面底部，在**连接性**容器中，打开**查看器 mTLS** 开关

1. 配置可用的查看器 mTLS 选项：
   + **客户端证书验证模式：**在“必需”模式和“可选”模式之间进行选择。在必需模式下，所有客户端都需要提供证书。在可选模式下，系统会对提供证书的客户端进行验证，而未提供证书的客户端也允许访问。
   + **公布信任存储 CA 名称：**选择在 TLS 握手过程中，是否向客户端公布信任存储中的 CA 名称。
   + **忽略证书到期日期：**选择是否允许使用到期证书建立连接（其他验证标准仍将适用）。
   + **连接函数：**可以关联一个可选的连接函数，来基于其他自定义标准允许/拒绝连接。

1. 选择右下角的**保存更改**。

### 关联信任存储（Amazon CLI）
<a name="associate-trust-store-cli"></a>

通过 DistributionConfig.ViewerMtlsConfig 属性可以将信任存储与分配相关联。这意味着我们首先需要获取分配配置，然后在后续的 UpdateDistribution 请求中提供 ViewerMtlsConfig。

```
// First fetch the distribution
aws cloudfront get-distribution {DISTRIBUTION_ID}

// Update the distribution config, for example:
Distribution config, file://distConf.json: 
{
  ...other fields,
  ViewerMtlsConfig: {
    Mode: 'required',
    TrustStoreConfig: {
        AdvertiseTrustStoreCaNames: false,
        IgnoreCertificateExpiry: true,
        TrustStoreId: {TRUST_STORE_ID}
    }
  }
}

aws cloudfront update-distribution \
   --id {DISTRIBUTION_ID} \
   --if-match {ETAG} \
   --distribution-config file://distConf.json
```

## 管理信任存储
<a name="manage-trust-stores"></a>

### 查看信任存储详细信息
<a name="view-trust-store-details"></a>

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

1. 在导航窗格中，选择**信任存储**。

1. 选择信任存储的名称以查看其详细信息页面。

详细信息页面将显示以下内容：
+ 信任存储名称和 ID
+ CA 证书数量
+ 创建日期和上次修改日期
+ 关联的分配
+ 标签

### 修改信任存储
<a name="modify-trust-store"></a>

要替换 CA 证书捆绑包，请执行以下操作：

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

1. 在导航窗格中，选择**信任存储**。

1. 选择信任存储的名称。

1. 选择**操作**，然后选择**编辑**。

1. 对于**证书颁发机构（CA）捆绑包**，输入更新后的 CA 捆绑包 PEM 文件的 Amazon S3 位置。

1. 选择**更新信任存储**。

### 删除信任存储
<a name="delete-trust-store"></a>

**先决条件：**您必须先取消信任存储与所有 CloudFront 分配的关联。

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

1. 在导航窗格中，选择**信任存储**。

1. 选择信任存储的名称。

1. 选择**删除信任存储**。

1. 选择**删除**以确认。

### 后续步骤
<a name="trust-store-next-steps"></a>

在创建信任存储并将其与 CloudFront 分配关联后，您可以继续在分配中启用双向 TLS 身份验证并配置其他设置，例如将证书标头转发到源。有关在分配中启用 mTLS 的详细说明，请参阅[为 CloudFront 分配启用双向 TLS](enable-mtls-distributions.md)。