View a markdown version of this page

在适用于 Java 的 SDK 中使用 TLS - AWS SDK for Java 2.x

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

在适用于 Java 的 SDK 中使用 TLS

适用于 Java 的 AWS SDK 使用其底层 Java 平台的 TLS 功能。在本主题中,我们将演示使用 Amazon Corretto 17 使用的 OpenJDK 实现的示例。

要使用 AWS 服务,底层 JDK 必须支持 TLS 1.2 的最低版本,但建议使用 TLS 1.3。

TLS 1.3 是启用后量子加密的先决条件,这可能需要额外的操作或配置。要了解更多信息,请参阅启用混合后量子 TLS

用户应查阅他们与 SDK 结合使用的 Java 平台的文档,以了解默认情况下启用了哪些 TLS 版本以及如何启用和禁用特定的 TLS 版本。

如何检查 TLS 版本信息

使用 OpenJDK,以下代码显示了如何使用 SSLContext 来打印支持哪些 TLS/SSL 版本。

System.out.println(Arrays.toString(SSLContext.getDefault().getSupportedSSLParameters().getProtocols()));

例如,Amazon Corretto 17 (OpenJDK) 会生成以下输出。

[TLSv1.3, TLSv1.2, TLSv1.1, TLSv1, SSLv3, SSLv2Hello]

要查看 SSL 握手的运行情况以及使用的 TLS 版本,可使用系统属性 javax.net.debug

例如,运行使用 TLS 的 Java 应用程序。

java app.jar -Djavax.net.debug=ssl:handshake

应用程序将记录 SSL 握手,类似于以下内容。

... javax.net.ssl|DEBUG|10|main|2022-12-23 13:53:12.221 EST|ClientHello.java:641|Produced ClientHello handshake message ( "ClientHello": { "client version" : "TLSv1.2", ... javax.net.ssl|DEBUG|10|main|2022-12-23 13:53:12.295 EST|ServerHello.java:888|Consuming ServerHello handshake message ( "ServerHello": { "server version" : "TLSv1.2", ...
AWS CRT HTTP 客户端 TLS 调试

如果您使用 AWS CRT HTTP 客户端,则前面示例中显示的 Java TLS 调试属性不起作用,因为 CRT 使用自己的 TLS 堆栈。要使用 CRT HTTP 客户端检查网络级请求的详细信息,请启用线路记录。有关更多信息,请参阅 启用线路日志记录

强制使用最低版本的 TLS

适用于 Java 的 SDK 始终首选平台和服务支持的最新 TLS 版本。强制执行特定的最低 TLS 版本的方法因您使用的 HTTP 客户端而异。

对于使用 Java TLS 堆栈的 Apache、Netty 和 URL Connection HTTP 客户端,使用系统属性jdk.tls.client.protocols。例如,要对 SDK 服务客户端强制执行 TLS 1.3,请提供以下系统属性。

java -Djdk.tls.client.protocols=TLSv1.3 -jar app.jar

有关配置 TLS 版本的更多信息,请参阅 Java 平台的文档。

对于使用自己的 TLS 堆栈的 AWS CRT HTTP 客户端,该jdk.tls.client.protocols系统属性不起作用。相反,使用minTlsVersion生成器选项强制执行最低的 TLS 版本。

TlsVersionenum (software.amazon.awssdk.http.crt.TlsVersion) 提供以下值:

TLS_1_3

强制将 TLS 1.3 作为最低版本。

SYSTEM_DEFAULT

使用平台的默认 TLS 版本协商行为。

以下示例创建了一个同步 AWS CRT HTTP 客户端,该客户端强制将 TLS 1.3 作为最低版本。

import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; AwsCrtHttpClient httpClient = AwsCrtHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3) .build();

以下示例创建了一个强制执行 TLS 1.3 作为最低版本的异步 AWS CRT HTTP 客户端。

import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; AwsCrtAsyncHttpClient asyncHttpClient = AwsCrtAsyncHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3) .build();

然后,您可以将配置的 HTTP 客户端传递给 AWS 服务客户端。

import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.http.crt.TlsVersion; S3Client s3Client = S3Client.builder() .httpClientBuilder(AwsCrtHttpClient.builder() .minTlsVersion(TlsVersion.TLS_1_3)) .build();
macOS 对 TLS 1.3 的要求

默认 macOS CRT TLS 后端 Apple 安全传输不支持 TLS 1.3。要在 macOS TlsVersion.TLS_1_3 上使用,必须在启动应用程序之前AWS_CRT_USE_NON_FIPS_TLS_13将环境变量设置为非空值。这会将 CRT 切换到其 s2n-tls 后端。

使用此环境变量时,请注意以下注意事项:

  • s2n-tls 后端不是。 FIPS-validated

  • s2n-tls 后端未与 macOS 密钥链集成。

如果您未在 macOS 上设置此环境变量,则第一个请求会因 CRT-side 错误而失败。

使用后量子 TLS 设置进行相互排斥

你不能postQuantumTlsEnabled(false)与结合minTlsVersion(TlsVersion.TLS_1_3)。在 CRT TLS 上下文中,这些选项是互斥的。如果两者都指定,则生成器会抛出。IllegalStateException

AWS API 端点升级到 TLS 1.2

有关将 AWS API 端点迁移到最低版本的 TLS 1.2 的信息,请参阅这篇博客文章。