

# 利用加密来保护传输中数据
<a name="UsingEncryptionInTransit"></a>

Amazon S3 的数据传输支持 HTTP 和 HTTPS 两种协议。HTTP 以纯文本格式传输数据，而 HTTPS 则通过使用传输层安全性协议（TLS）加密数据增加了一层安全保护。TLS 可防止侦听、数据篡改和中间人攻击。虽然可以接受 HTTP 流量，但大多数实施都使用 HTTPS 和 TLS 进行传输中加密，来保护在客户端和 Amazon S3 之间传输的数据。

## TLS 1.2 和 TLS 1.3 支持
<a name="UsingEncryptionInTransit.TLS-support"></a>

对于所有 AWS 区域的所有 API 端点，Amazon S3 支持 HTTPS 连接的 TLS 1.2 和 TLS 1.3。S3 会自动协商您的客户端软件和所访问 S3 端点支持的最强 TLS 保护。当前 AWS 工具（2014 年及以后）包括 AWS SDK，AWS CLI 自动默认使用 TLS 1.3，无需您采取任何操作。如果需要向后兼容 TLS 1.2，您可以通过客户端配置设置指定特定的 TLS 版本，来覆盖此自动协商。使用 TLS 1.3 时，您可以选择配置混合后量子密钥交换（ML-KEM），向 Amazon S3 发出抗量子请求。有关更多信息，请参阅 [为客户端配置混合后量子 TLS](pqtls-how-to.md)。

**注意**  
除了适用于 Amazon S3 的 AWS PrivateLink 和多区域接入点之外，所有 S3 端点均支持 TLS 1.3。

## 监控 TLS 使用情况
<a name="UsingEncryptionInTransit.monitoring"></a>

您可以使用 Amazon S3 服务器访问日志或 AWS CloudTrail 来监控对 Amazon S3 存储桶的请求。两个日志记录选项都记录每个请求中使用的 TLS 版本和密码套件。
+ **Amazon S3 服务器访问日志**：服务器访问日志记录提供对存储桶发出的请求的详细报告。例如，访问日志信息可能在安全和访问权限审核方面很有用。有关更多信息，请参阅 [Amazon S3 服务器访问日志格式](LogFormat.md)。
+ **AWS CloudTrail**：[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 是提供用户、角色或 AWS 服务所执行操作的记录的服务。CloudTrail 将 Amazon S3 的所有 API 调用作为事件捕获。有关更多信息，请参阅 [Amazon S3 CloudTrail 事件](cloudtrail-logging-s3-info.md)。

## 在传输过程中强制加密
<a name="UsingEncryptionInTransit.enforcement"></a>

在向 Amazon S3 传输数据时，执行传输中数据加密是一种最佳安全实践。您可以通过各种策略机制来实施仅限 HTTPS 的通信或使用特定的 TLS 版本。这些机制包括适用于 S3 存储桶的基于 IAM 资源的策略（[存储桶策略](bucket-policies.md)）、[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)（SCP）、[资源控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)（RCP）和 [VPC 端点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

### 用于强制实施传输中加密的存储桶策略示例
<a name="UsingEncryptionInTransit.bucket-policy-example"></a>

您可以使用 [S3 条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys) `s3:TlsVersion`，根据客户端使用的 TLS 版本限制对 Amazon S3 存储桶的访问权限。有关更多信息，请参阅 [示例 6：要求最低 TLS 版本](amazon-s3-policy-keys.md#example-object-tls-version)。

**Example 使用 `S3:TlsVersion` 条件键强制实施 TLS 1.3 的存储桶策略**  

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyInsecureConnections",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
        "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ],
      "Condition": {
        "NumericLessThan": {
          "s3:TlsVersion": "1.3"
        }
      }
    }
  ]
}
```

您可以在 S3 存储桶策略中使用 `aws:SecureTransport` [全局条件键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)来检查请求是否通过 HTTPS（TLS）发送。与前一示例不同，此条件不检查是否使用了特定 TLS 版本。有关更多信息，请参阅 [仅限 HTTPS 请求访问](example-bucket-policies.md#example-bucket-policies-use-case-HTTP-HTTPS-1)。

**Example 使用 `aws:SecureTransport` 全局条件键强制实施 HTTPS 的存储桶策略**  

```
{
    "Version":"2012-10-17",		 	 	 		 	 	 
    "Statement": [
     {
        "Sid": "RestrictToTLSRequestsOnly",		 	 	 
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1",
            "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }
  ]
}
```

**基于这两种键的策略示例和更多示例**  
您可以在一个策略中使用前面示例中演示的两种条件键。有关更多信息和其他强制实施方法，请参阅 AWS Storage 博客文章 [Enforcing encryption in transit with TLS1.2 or higher with Amazon S3](https://aws.amazon.com/blogs/storage/enforcing-encryption-in-transit-with-tls1-2-or-higher-with-amazon-s3/)。

# 将混合后量子 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 密码套件。