

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在应用程序负载均衡器中使用 TLS 进行双向身份验证
<a name="mutual-authentication"></a>

双向 TLS 身份验证是传输层安全性协议（TLS）的一种变体。传统 TLS 在服务器和客户端之间建立安全通信，其中服务器需要向其客户端提供其身份。借助双向 TLS，负载均衡器在协商 TLS 的同时协商客户端和服务器之间的双向身份验证。将双向 TLS 与应用程序负载均衡器结合使用时，可以简化身份验证管理并降低应用程序的负载。

通过使用双向 TLS，您的负载均衡器可以管理客户端身份验证，从而帮助确保只有受信任的客户端才能与您的后端应用程序通信。使用此功能时，负载均衡器使用来自第三方证书颁发机构 (CA) 的证书或使用 (PCA) AWS 私有证书颁发机构 （可选）对客户端进行身份验证，并进行吊销检查。负载均衡器会使用 HTTP 标头将客户端证书信息传递到后端，您的应用程序可以将该信息用于授权。

适用于应用程序负载均衡器的双向 TLS 提供了以下两个 X.509v3 客户端证书验证选项：
+ **双向 TLS 传递：**负载均衡器在不作验证的情况下将整个客户端证书链发送到目标。目标负责验证客户端证书链。然后通过使用客户端证书链，您可以在应用程序中实现负载均衡器身份验证和目标授权逻辑。
+ **双向 TLS 验证：**负载均衡器会在负载均衡器协商 TLS 连接时为客户端执行 X.509 客户端证书身份验证。

要使用双向 TLS 传递模式，必须将侦听器配置为接受来自客户端的证书。要使用双向 TLS 进行验证，请参阅[在应用程序负载均衡器上配置双向 TLS](configuring-mtls-with-elb.md)。

## 在应用程序负载均衡器上开始配置双向 TLS 之前
<a name="mtls-for-awareness"></a>

在应用程序负载均衡器上开始配置双向 TLS 之前，请注意以下事项：

**配额**  
应用程序负载均衡器包括与您的 AWS 账户中使用的信任存储库、CA 证书和证书吊销列表数量相关的某些限制。  
有关更多信息，请参阅 [Quotas for your Application Load Balancers](load-balancer-limits.md)。

**证书要求**  
应用程序负载均衡器支持以下证书用于双向 TLS 身份验证：  
+ 支持的证书：X.509v3
+ 支持的公钥：RSA 2K – 8K 或 ECDSA secp256r1、secp384r1、secp521r1
+ 支持的签名算法： SHA256，384、512，带有 RSA/SHA256, 384, 512 with EC/SHA 256,384,512 个哈希值和 RSSASS-PSS MGF1

**CA 证书捆绑包**  
以下内容适用于证书颁发机构（CA）捆绑包：  
+ 应用程序负载均衡器批量上传每个证书颁发机构（CA）证书捆绑包。应用程序负载均衡器不支持上传单个证书。如果需要添加新证书，则必须上传证书捆绑包文件。
+ 要替换 CA 证书包，请使用 [ModifyTrustStore](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_ModifyTrustStore.html)API。

**证书传递顺序**  
当您使用双向 TLS 传递时，应用程序负载均衡器会插入标头以将客户端证书链呈现给后端目标。呈现顺序从叶证书开始，以根证书结束。

**会话恢复**  
对应用程序负载均衡器使用双向 TLS 传递或验证模式时，不支持会话恢复。

**HTTP 标头**  
在使用双向 TLS 协商客户端连接时，应用程序负载均衡器使用 `X-Amzn-Mtls` 标头发送证书信息。有关更多信息和示例标头，请参阅 [HTTP 标头和双向 TLS](#mtls-http-headers)。

**CA 证书文件**  
CA 证书文件必须满足以下要求：  
+ 证书文件必须使用 PEM（隐私增强邮件）格式。
+ 证书内容必须包含在 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----` 边界内。
+ 注释必须以 `#` 字符开头，并且不得包含任何 `-` 字符。
+ 不能有任何空行。
不接受（无效）的证书示例：  

```
# comments

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 01
    Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=US, O=EXAMPLE, OU=EXAMPLE, CN=EXAMPLE
        Validity
            Not Before: Jan 11 23:57:57 2024 GMT
            Not After : Jan 10 00:57:57 2029 GMT
        Subject: C=US, O=EXAMPLE, OU=EXAMPLE, CN=EXAMPLE
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (384 bit)
                pub: 
                    00:01:02:03:04:05:06:07:08
                ASN1 OID: secp384r1
                NIST CURVE: P-384
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Certificate Sign, CRL Sign
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Key Identifier: 
                00:01:02:03:04:05:06:07:08
            X509v3 Subject Alternative Name: 
                URI:EXAMPLE.COM
    Signature Algorithm: ecdsa-with-SHA384
         00:01:02:03:04:05:06:07:08
-----BEGIN CERTIFICATE-----
Base64–encoded certificate
-----END CERTIFICATE-----
```
接受（有效）的证书示例：  

1. 单一证书（PEM 编码）：

   ```
   # comments
   -----BEGIN CERTIFICATE-----
   Base64–encoded certificate
   -----END CERTIFICATE-----
   ```

1. 多个证书（PEM 编码）：

   ```
   # comments
   -----BEGIN CERTIFICATE-----
   Base64–encoded certificate
   -----END CERTIFICATE-----
   # comments
   -----BEGIN CERTIFICATE-----
   Base64–encoded certificate
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   Base64–encoded certificate
   -----END CERTIFICATE-----
   ```

## HTTP 标头和双向 TLS
<a name="mtls-http-headers"></a>

本节介绍在使用双向 TLS 与客户端协商连接时应用程序负载均衡器用于发送证书信息的 HTTP 标头。应用程序负载均衡器使用的特定 `X-Amzn-Mtls` 标头取决于您指定的双向 TLS 模式：传递模式或验证模式。

有关应用程序负载均衡器支持的其他 HTTP 标头的信息，请参阅 [HTTP 标头和 Application Load Balancer](x-forwarded-headers.md)。

### 传递模式的 HTTP 标头
<a name="mtls-http-headers-passthrough"></a>

对于传递模式下的双向 TLS，应用程序负载均衡器使用以下标头。

#### X-Amzn-Mtls-Clientcert
<a name="example-pass-through"></a>

此标头包含连接中呈现的整个客户端证书链的 URL 编码 PEM 格式，其中 `+=/` 作为安全字符。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert: -----BEGIN%20CERTIFICATE-----%0AMIID<...reduced...>do0g%3D%3D%0A-----END%20CERTIFICATE-----%0A-----BEGIN%20CERTIFICATE-----%0AMIID1<...reduced...>3eZlyKA%3D%3D%0A-----END%20CERTIFICATE-----%0A
```

### 验证模式的 HTTP 标头
<a name="mtls-http-headers-verify"></a>

对于验证模式下的双向 TLS，应用程序负载均衡器使用以下标头。

#### X-Amzn-Mtls-Clientcert-Serial-Number
<a name="example-verify1"></a>

此标头包含叶证书序列号的十六进制表示形式。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert-Serial-Number: 03A5B1
```

#### X-Amzn-Mtls-Clientcert-Issuer
<a name="example-verify1"></a>

此标头包含颁发者可分辨名称 (DN) 的 RFC2253 字符串表示形式。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert-Issuer: CN=rootcamtls.com,OU=rootCA,O=mTLS,L=Seattle,ST=Washington,C=US
```

#### X-Amzn-Mtls-Clientcert-Subject
<a name="example-verify1"></a>

此标头包含主题可分辨名称 (DN) 的 RFC2253 字符串表示形式。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert-Subject: CN=client_.com,OU=client-3,O=mTLS,ST=Washington,C=US
```

#### X-Amzn-Mtls-Clientcert-Validity
<a name="example-verify1"></a>

此标题包含`notBefore`和`notAfter`日期的 ISO8601 格式。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert-Validity: NotBefore=2023-09-21T01:50:17Z;NotAfter=2024-09-20T01:50:17Z
```

#### X-Amzn-Mtls-Clientcert-Leaf
<a name="example-verify1"></a>

此标头包含叶证书的 URL 编码 PEM 格式，其中 `+=/` 作为安全字符。

**标头内容示例：**

```
X-Amzn-Mtls-Clientcert-Leaf: -----BEGIN%20CERTIFICATE-----%0AMIIG<...reduced...>NmrUlw%0A-----END%20CERTIFICATE-----%0A
```

## 公开证书颁发机构（CA）主题名称
<a name="advertise-ca-subject"></a>

公开证书颁发机构（CA）主题名称有助于客户端确定在双向 TLS 身份验证期间将接受的证书，从而增强身份验证过程。

启用广告 CA 主题名称后，Application Load Balancer 将根据与之关联的信任存储区公布其信任的证书颁发机构 (CAs) 主题名称列表。当客户端通过应用程序负载均衡器连接到目标时，该客户端会收到可信 CA 主题名称列表。

在 TLS 握手期间，当 Application Load Balancer 请求客户端证书时，它会在证书请求消息中包含受信任的 CA 可分辨名称列表 (DNs)。这有助于客户端选择与所公开 CA 主题名称相匹配的有效证书，从而简化身份验证过程并减少连接错误。

您可以在新侦听器和现有侦听器上启用“公开 CA 主题名称”。有关更多信息，请参阅 [添加 HTTPS 侦听器](create-https-listener.md#add-https-listener)。

## 应用程序负载均衡器的连接日志
<a name="mtls-logging"></a>

Elastic Load Balancing 提供了连接日志，用于捕获有关发送到应用程序负载均衡器的请求的属性。连接日志包含客户端 IP 地址和端口、客户端证书信息、连接结果以及正在使用的 TLS 密码等信息。然后可以使用这些连接日志来查看请求模式和其他趋势。

要了解有关连接日志的更多信息，请参阅 [应用程序负载均衡器的连接日志](load-balancer-connection-logs.md)