本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在适用于 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 版本。根据您使用的 HTTP 客户端,强制执行特定的最低 TLS 版本的方法会有所不同。
对于使用 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 后端,不支持 TLS 1.3。要TlsVersion.TLS_1_3在 macOS 上使用,必须在启动应用程序之前将环境变量设置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
有关迁移到 TLS 1.2 的最低版本 AWS 的 API 端点的信息,请参阅此博客文章