

# 为 CloudFront 分配启用双向 TLS
<a name="enable-mtls-distributions"></a>

## 先决条件和要求
<a name="mtls-prerequisites-requirements"></a>

CloudFront 的双向 TLS 验证模式要求所有客户端在 TLS 握手过程中提供有效证书，并拒绝未使用有效证书的连接。在 CloudFront 分配上启用双向 TLS 之前，请确保：
+ 已使用证书颁发机构证书创建信任存储
+ 已将信任存储与 CloudFront 分配关联
+ 所有分配缓存行为都使用仅 HTTPS 查看器协议策略
+ 分配使用的是 HTTP/2（默认设置，HTTP/3 不支持查看器 mTLS）

**注意**  
双向 TLS 身份验证要求在查看器和 CloudFront 之间建立 HTTPS 连接。您无法在具有任何支持 HTTP 连接的缓存行为的分配上启用 mTLS。

## 启用双向 TLS（控制台）
<a name="enable-mtls-console"></a>

### 对于新的分配
<a name="enable-mtls-new-distributions"></a>

在 CloudFront 控制台中创建新分配的过程中，无法配置查看器 mTLS。首先，通过任意方式（控制台、CLI、API）创建分配，然后根据以下现有分配说明操作，编辑分配设置以启用查看器 mTLS。

### 对于现有分配
<a name="enable-mtls-existing-distributions"></a>

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

1. 从分配列表中，选择要修改的分配。

1. 确保将所有缓存行为的查看器协议策略设置为**将 HTTP 重定向到 HTTPS** 或**仅 HTTPS**。（您可以选择**缓存行为**选项卡，查看和更新任何使用 HTTP 协议策略的缓存行为。）

1. 选择**常规**选项卡。

1. 在**设置**部分中，选择**编辑**。

1. 在**连接性**部分中，找到**查看器双向身份验证(mTLS)**。

1. 将**启用双向身份验证**切换为“开启”状态。

1. 对于**客户端证书验证模式**，选择**必需**（所有客户端都必须提供证书）或**可选**（客户端可以选择性地提供证书）。

1. 对于**信任存储**，选择您之前创建的信任存储。

1. （可选）如果您希望 CloudFront 在 TLS 握手过程中向客户端发送 CA 名称，请切换**公布信任存储 CA 名称**。

1. （可选）如果您想允许使用到期证书进行连接，请切换**忽略证书到期日期**。

1. 选择**保存更改**。

## 启用双向 TLS（Amazon CLI）
<a name="enable-mtls-cli"></a>

### 对于新的分配
<a name="enable-mtls-cli-new"></a>

以下示例演示如何创建包含 mTLS 设置的分配配置文件（distribution-config.json）：

```
{
  "CallerReference": "cli-example-1",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "my-origin",
        "DomainName": "example.com",
        "CustomOriginConfig": {
          "HTTPPort": 80,
          "HTTPSPort": 443,
          "OriginProtocolPolicy": "https-only"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "my-origin",
    "ViewerProtocolPolicy": "https-only",
    "MinTTL": 0,
    "ForwardedValues": {
      "QueryString": false,
      "Cookies": {
        "Forward": "none"
      }
    }
  },
  "ViewerCertificate": {
    "CloudFrontDefaultCertificate": true
  },
  "ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
  },
  "Enabled": true
}
```

使用以下示例命令创建启用了 mTLS 的分配：

```
aws cloudfront create-distribution --distribution-config file://distribution-config.json
```

### 对于现有分配
<a name="enable-mtls-cli-existing"></a>

使用以下示例命令获取当前分配配置：

```
aws cloudfront get-distribution-config --id E1A2B3C4D5E6F7 --output json > dist-config.json
```

编辑文件以添加 mTLS 设置。将以下示例部分配置添加到分配配置：

```
"ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
}
```

从文件中删除 ETag 字段，但单独保存其值。

使用以下示例命令，以新配置更新分配：

```
aws cloudfront update-distribution \
    --id E1A2B3C4D5E6F7 \
    --if-match YOUR-ETAG-VALUE \
    --distribution-config file://dist-config.json
```

## 查看器协议策略
<a name="viewer-protocol-policies"></a>

在使用双向 TLS 时，必须为所有分配缓存行为配置仅 HTTPS 查看器协议策略：
+ **将 HTTP 重定向到 HTTPS**：在执行证书验证之前将 HTTP 请求重定向到 HTTPS。
+ **仅 HTTPS**：仅接受 HTTPS 请求并执行证书验证。

**注意**  
由于 HTTP 连接无法执行证书验证，因此双向 TLS 不支持 HTTP 和 HTTPS 查看器协议策略。

## 后续步骤
<a name="enable-mtls-next-steps"></a>

在 CloudFront 分配中启用查看器 TLS 后，您可以关联连接函数以实施自定义证书验证逻辑。利用连接函数，您可以通过自定义验证规则、证书吊销检查和日志记录来扩展内置 mTLS 身份验证功能。有关创建和关联连接函数的详细信息，请参阅[关联 CloudFront 连接函数](connection-functions.md)。