

# 其它验证模式
<a name="mtls-validation-modes"></a>

必需模式是 CloudFront 双向 TLS 的默认模式：CloudFront 会验证每个客户端证书并拒绝失败的连接。但是，为了支持其它使用案例（例如，提供经过 MTLS 身份验证和未经身份验证的客户端组合的应用程序，或者原始服务器执行其自己的 mTLS 验证的环境），CloudFront 支持另外两种模式。

**可选模式**专为具有混合客户端群体的应用程序而设计。例如，一个门户，它向未经身份验证的浏览器提供公共内容，同时将 API 端点限制为提供有效证书的客户端。或者是迁移场景，即您正在逐步将客户端加入到 mTLS，并且需要在过渡期间同时支持经过身份验证和未经身份验证的连接。

**直通模式**专为其原始服务器已经执行 mTLS 验证的客户而设计。例如，从本地反向代理、其它 CDN 或已经处理证书验证的应用程序负载均衡器迁移的服务。直通模式支持这些客户将 CloudFront 置于其应用程序的前面，而无需在边缘重新实施验证逻辑。

## 可选模式
<a name="optional-mode-details"></a>

### 客户端证书验证可选模式
<a name="optional-mode-overview"></a>

CloudFront 提供了一种备用的可选客户端证书验证模式，该模式可验证所提供的客户端证书，但会向未提供证书的客户端授予访问权限。

### 可选模式行为
<a name="optional-mode-behavior-details"></a>
+ 授权与拥有有效证书的客户端建立连接（无效证书将遭拒绝）。
+ 支持与无证书的客户端建立连接。
+ 允许通过单个分配实施的混合客户端身份验证场景。

可选模式非常适合向 mTLS 身份验证逐步迁移，既能支持拥有证书的客户端与无证书的客户端，又能保持与传统客户端的向后兼容性。

**注意**  
在可选模式下，即使客户端未提供证书，连接函数也将被调用。这可让您实施自定义逻辑，例如记录客户端 IP 地址或根据是否提供了证书来应用不同的策略。

### 配置可选模式（控制台）
<a name="configure-optional-mode-console-new"></a>

1. 在分配设置中，导航至**常规**选项卡，选择**编辑**。

1. 滚动到**连接性**容器中的**查看器双向身份验证(mTLS)** 部分。

1. 对于**客户端证书验证模式**，选择**可选**。

1. 保存更改。

### 配置可选模式（AWS CLI）
<a name="configure-optional-mode-cli-new"></a>

以下示例演示如何配置可选模式：

```
"ViewerMtlsConfig": {
    "Mode": "optional",
    ...other settings
}
```

**自定义证书标头**

在查看器请求 CloudFront Functions 中使用 mTLS 助手函数，来在证书标头到达源之前对其进行重命名、重新格式化或组合。从使用不同标头名称或证书编码格式的其它服务迁移时，这很有用。

## 直通模式
<a name="passthrough-mode-details"></a>

直通模式支持在其源处具有现有 mTLS 实施的客户使用 CloudFront。CloudFront 会终止 TLS 连接，并将客户端证书作为 HTTP 标头转发到源。源执行所有证书验证，包括链验证、吊销检查和自定义策略执行。

### 直通模式的工作原理
<a name="passthrough-how-it-works"></a>

1. 客户端连接到 CloudFront，并在 TLS 握手期间提供客户端证书。

1. CloudFront 在不根据信任存储验证证书的情况下完成 TLS 握手。

1. CloudFront 将客户端证书和证书链作为 HTTP 标头添加到请求中。

1. 请求转发到源。不缓存任何内容。

1. 源验证证书并处理请求。

客户端也可以在不提供证书的情况下进行连接。源或连接函数处理空证书场景。

**注意**  
在直通模式下，即使客户端未提供证书，也调用连接函数。这可让您实施自定义逻辑，例如记录客户端 IP 地址或根据是否提供了证书来应用不同的策略。

### 配置要求
<a name="passthrough-configuration-requirements"></a>
+ **无信任存储**：分配必须具有零信任存储关联。
+ **缓存已禁用**：所有缓存行为都必须使用托管式 `CachingDisabled` 缓存策略。
+ **禁止 Origin Shield**：无法启用 Origin Shield。
+ **禁止 Lambda@Edge**：不支持 Lambda@Edge 函数关联。
+ **需要源请求策略**：您必须在源请求策略中将 `Client-Cert` 和 `Client-Cert-Chain` 标头列入许可名单，这样源才能接收它们。
+ **证书链深度**：CloudFront 允许将客户端证书链转发到源的最大深度为 4。

### 启用直通模式
<a name="enable-passthrough-mode"></a>

#### 控制台
<a name="enable-passthrough-console"></a>

1. 更新所有缓存行为以使用托管式 `CachingDisabled` 缓存策略。

1. 打开 CloudFront 控制台并选择您的分配。

1. 选择**常规**选项卡，然后在“设置”下选择**编辑**。

1. 在**查看器双向身份验证（mTLS）**下，选择**直通**。

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

#### AWS CLI
<a name="enable-passthrough-cli"></a>

确保所有缓存行为都引用托管式 `CachingDisabled` 策略，然后更新分配配置：

```
{
  "ViewerMtlsConfig": {
    "Mode": "passthrough"
  }
}
```

### 标头转发到源
<a name="passthrough-headers-forwarded"></a>

CloudFront 将以下标头添加到发送到源的请求中：
+ `Client-Cert`：客户端提供的终端实体（叶）证书，采用 base64 编码。
+ `Client-Cert-Chain`：证书链（不包括叶），作为结构化字段列表。密码必须采用 base64 编码。`Client-Cert-Chain` 是列表类型的标头。它可能在请求中多次出现。串联所有值可保留原始链顺序。当客户端仅提供单个证书时，将省略 `Client-Cert-Chain`。

在添加实际证书数据之前，CloudFront 会丢弃来自客户端请求的任何传入 `Client-Cert` 或 `Client-Cert-Chain` 标头。这样可以防止标头欺骗。

**自定义证书标头**

在查看器请求 CloudFront Functions 中使用 mTLS 助手函数，来在证书标头到达源之前对其进行重命名、重新格式化或组合。从使用不同标头名称或证书编码格式的其它服务迁移时，这很有用。