本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在适用于 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
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 版本。
TlsVersionsoftware.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 的信息,请参阅这篇