

# 将混合后量子 TLS 与 Amazon S3 结合使用
<a name="UsingEncryptionInTransit.PQ-TLS"></a>

Amazon S3 支持 TLS 网络加密协议的混合后量子密钥交换选项。当您向采用 TLS 1.3 的 Amazon S3 端点发出请求时，可以使用此 TLS 选项。S3 支持用于 TLS 会话的传统密码套件，使得针对密钥交换机制进行的暴力攻击在现有技术下是不可行的。不过，如果与密码学相关的量子计算机在未来得到广泛应用，那么 TLS 密钥交换机制中使用的传统密码套件将会容易受到这些攻击。目前，业内已就混合后量子密钥交换达成共识，此方法将传统加密算法与后量子要素相结合，可确保 TLS 连接至少与传统密码套件一样强大。目前，Amazon S3 支持混合 PQ-TLS，符合行业标准的 IANA 规范。

如果您正在开发的应用程序高度重视通过 TLS 连接传输的数据的长期保密性，则应考虑在大规模量子计算机投入使用之前迁移到后量子密码术的计划。作为责任共担模型的一部分，S3 在我们的服务端点上启用了量子安全密码学技术。由于浏览器和应用程序支持 PQ-TLS，S3 将选择尽可能强的配置来保护传输中数据。

**支持的端点类型和 AWS 区域**

适用于 Amazon S3 的后量子 TLS 在所有 AWS 区域中提供。有关每个 AWS 区域中 S3 端点的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Simple Storage Service 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

**注意**  
除了适用于 Amazon S3 的 AWS PrivateLink、多区域接入点和 S3 Vectors 之外，所有 S3 端点均支持混合后量子 TLS。

## 将混合后量子 TLS 与 Amazon S3 结合使用
<a name="pqtls-details"></a>

您必须配置客户端，使其向 Amazon S3 发出请求来支持混合后量子 TLS。在设置 HTTP 客户端测试环境或生产环境时，请注意以下信息：

**传输中加密**

混合后量子 TLS 仅适用于传输中加密。这可以在数据从客户端传输到 S3 端点的过程中保护数据。这种新支持的功能与 Amazon S3 服务器端加密（默认使用 AES-256 算法）相结合，为客户提供了传输中数据和静态数据的抗量子加密。有关 Amazon S3 中服务器端加密的更多信息，请参阅[使用服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

**支持的客户端**

要使用混合后量子 TLS，您需要使用支持此功能的客户端。AWSSDK 和工具的加密功能及配置因语言和运行时而异。要了解有关特定工具的后量子密码术的更多信息，请参阅[启用混合后量子 TLS](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)。

**注意**  
对于向 Amazon S3 发出的请求，AWS CloudTrail 事件或 S3 服务器访问日志中不提供 PQ-TLS 密钥交换详细信息。

## 了解后量子 TLS 的更多信息
<a name="pqtls-see-also"></a>

有关使用混合后量子 TLS 的更多信息，请参阅以下资源。
+ 要了解 AWS 的后量子密码术，包括博客文章和研究论文的链接，请参阅 [Post-Quantum Cryptography for AWS](https://aws.amazon.com/security/post-quantum-cryptography/)。
+ 有关 s2n-tls 的信息，请参阅[推出新的开源 TLS 实施 s2n-tls](https://aws.amazon.com/blogs/security/introducing-s2n-a-new-open-source-tls-implementation/) 和[使用 s2n-tls](https://github.com/aws/s2n-tls/tree/main/docs/usage-guide)。
+ 有关 AWS 公共运行时 HTTP 客户端的信息，请参阅《AWS SDK for Java 2.x 开发者指南》中的 [配置基于 AWS CRT 的 HTTP 客户端](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)**。
+ 有关美国国家标准和技术研究所 (NIST) 开展的后量子密码加密技术项目的信息，请参阅[后量子密码加密技术](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography)。
+ 有关 NIST 后量子密码术标准化的信息，请参阅 [NIST's Post-Quantum Cryptography Standardization](https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization)。

# 为客户端配置混合后量子 TLS
<a name="pqtls-how-to"></a>

要将 PQ-TLS 与 Amazon S3 结合使用，您需要将客户端配置为支持后量子密钥交换算法。您还要确保客户端支持混合方法，该方法将传统的椭圆曲线加密与后量子算法 [例如 ML-KEM（模块化格基密钥封装机制）] 相结合。

具体配置取决于客户端库和编程语言。有关多信息，请参阅[启用混合后量子 TLS](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)。

## 客户端配置示例：适用于 Java 2 的 AWS SDK
<a name="UsingEncryptionInTransit.PQ-TLS.configuration.java2-sdk"></a>

在此过程中，为 AWS 公共运行时 HTTP 客户端添加一个 Maven 依赖项。然后配置一个优先使用后量子 TLS 的 HTTP 客户端。然后，创建使用 HTTP 客户端的 Amazon S3 客户端。

**注意**  
AWS 公共运行时 HTTP 客户端现已开放预览版，并于 2023 年 2 月全面开放。在正式发行版中，`tlsCipherPreference` 类和 `tlsCipherPreference()` 方法参数已替换为 `postQuantumTlsEnabled()` 方法参数替。如果您在预览期间使用此示例，则需要更新您的代码。

1. 将 AWS 公共运行时客户端添加到您的 Maven 依赖项中。我们建议您使用最新可用版本。

   例如，以下语句将 AWS 公共运行时客户端的版本 `2.30.22` 添加到您的 Maven 依赖项中。

   ```
   <dependency>
       <groupId>software.amazon.awssdk</groupId>
       <artifactId>aws-crt-client</artifactId>
       <version>2.30.22</version>
   </dependency>
   ```

1. 要启用混合后量子密码套件，请将 AWS SDK for Java 2.x 添加到您的项目中并进行初始化。然后按照以下示例所示，在您的 HTTP 客户端上启用混合后量子密码套件。

   此代码使用 `postQuantumTlsEnabled()` 方法参数来配置 [AWS 通用运行时 HTTP 客户端](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)，从而优先使用推荐的混合后量子密码套件（即 ECDH 与 ML-KEM 的组合）。然后，它使用配置的 HTTP 客户端来构建一个 Amazon S3 异步客户端实例（即 ）[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html)。此代码完成后，`S3AsyncClient` 实例上的所有 [Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/) 请求都将使用混合后量子 TLS。
**重要**  
从 v2.35.11 开始，调用方不再需要设置 `.postQuantumTlsEnabled(true)` 来为客户端启用混合后量子 TLS。所有高于 v2.35.11 的版本都默认启用后量子 TLS。

   ```
   // Configure HTTP client
   SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder()
             .postQuantumTlsEnabled(true)
             .build();
   
   // Create the Amazon S3 async client
   S3AsyncClient s3Async = S3AsyncClient.builder()
            .httpClient(awsCrtHttpClient)
            .build();
   ```

1. 使用混合后量子 TLS 测试您的 Amazon S3 调用。

   在配置的 Amazon S3 客户端上调用 Amazon S3 API 操作时，系统会使用混合后量子 TLS 将您的调用传输到 Amazon S3 端点。要测试您的配置，您需要调用一个 Amazon S3 API，例如 `[ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)`。

   ```
   ListBucketsResponse reponse = s3Async.listBuckets();
   ```

### 测试您的混合后量子 TLS 配置
<a name="pqtls-testing"></a>

请考虑在调用 Amazon S3 的应用程序上，使用混合密码套件运行下面的测试。
+ 运行负载测试和基准测试。混合密码套件的执行方式与传统密钥交换算法有所不同。您可能需要调整连接超时，以便增加握手时间。如果您在 AWS Lambda 函数内部运行，请增大执行超时设置。
+ 请尝试从不同位置进行连接。根据您的请求采用的网络路径，您可能会发现中间主机、代理或带有深度数据包检查 (DPI) 功能的防火墙阻止了请求。这可能是因为在 TLS 握手的 [ClientHello](https://tools.ietf.org/html/rfc5246#section-7.4.1.2) 部分中使用了新的密码套件，或者密钥交换消息比较大。如果您在解决这些问题时遇到麻烦，请与安全团队或 IT 管理员一起，更新相关配置并取消阻止新的 TLS 密码套件。