亚马逊AWS官方博客

TLS 1.3 与适用于 Java 的 AWS SDK 版本 1.9.5 至 1.10.31 不兼容

AWS 致力于确保您的 Java 应用程序使用最新的加密协议进行连接,进而提高性能和安全性。这包括传输层安全性协议(TLS)版本 1.3,我们正努力在所有服务中添加对该版本的支持。本博客旨在告知您,适用于 Java 的 AWS SDK 的旧版本(从版本 1.9.5 到 1.10.31)与 TLS 1.3 不兼容。如果您使用的是这些版本,要想继续能够连接到 AWS 端点,您将需要执行我们在下面概述的三种可能的操作之一。如果您未执行任何操作,则使用受影响的版本的客户在尝试连接到提供 TLS 1.3 的 AWS 端点时将失败,并显示“SecurityException: Invalid SSL master secret”。   适用于 Java 的 AWS SDK 版本 1.10.32 及更高版本,包括适用于 Java 的 AWS SDK 2.x,将不会受到影响。

哪些适用于 Java 的 AWS SDK 版本无法使用 TLS 1.3 进行连接?

如果您的应用程序符合以下两个条件,则可能会受到影响:

  1. 您的应用程序使用的适用于 Java 的 AWS SDK 版本介于版本 1.9.5 和 1.10.31 之间,并且
  2. 您使用的 JDK 版本默认启用 TLS 1.3,或者您已使用 jdk.tls.client.protocols 系统属性明确启用 TLS 1.3。

如果您的应用程序同时符合这两个条件,则当 AWS 服务支持 TLS 1.3 时,通过适用于 Java 的 SDK 进行的所有 API 调用都将失败。

请注意,如果您的应用程序仅满足第一个条件,那么以后将您的 JDK 升级到启用 1.3 的版本时,您的应用程序可能会受到影响。2022 年 7 月 19 日,Java 8 已默认启用 TLS 1.3。从 2022 年 5 月 11 日起,JDK 版本 11 及更高版本默认启用 TLS 1.3。

我如何获知自己是否会受到影响?

您可以使用 Maven 依赖项插件,检查以下 Maven 命令输出中的 aws-java-sdk-core 版本,来确定您当前是否正在使用受影响的 AWS SDK Java 版本:

mvn dependency:tree

以下示例显示 MyApp 应用程序依赖适用于 Java 的 SDK 版本 1.9.5:

[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< software.amazon.awssdk:MyApp >--------------------
[INFO] Building MyApp 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ MyApp ---
[INFO] software.amazon.awssdk:MyApp:jar:1.0-SNAPSHOT
[INFO] +- com.amazonaws:aws-java-sdk-cloudfront:jar:1.9.5:compile

要检查您的 Java 版本,可以使用

java -version

请注意,应用程序经常会在运行时使用特定的 java 可执行文件。请务必调用最终将用于运行应用程序的 Java 可执行文件。

SDK 版本和 JDK 版本还包含 SDK 发出的 HTTP 请求的 User-Agent 标头,因此您还可以查询 CloudTrail 日志,以查看您是否正在使用受影响的 SDK 版本进行 API 调用。

如果我的应用程序受到影响,该怎么办?

如果已确定您的应用程序受到影响,则可以选择下列选项之一:

选项 1(最轻松):将您的应用程序升级到适用于 Java 的 AWS SDK 1.12.x 或更高版本。

将您的应用程序升级到适用于 Java 的 SDK 1.x 支持的最新版本是最轻松的选择。请注意,版本 1.9.x、1.10.x 和 1.12.x 之间存在一些颠覆性的 SDK 行为更改。例如,1.10.x 及更高版本默认启用限制重试,并从服务客户端接口中移除了一些以前公共 API。 这些版本并不兼容,您需要仔细测试您的应用程序,确保它在更新版本下按预期运行。

选项 2(推荐):将您的应用程序升级到适用于 Java 的 AWS SDK 版本 2.x。

适用于 Java 的 AWS SDK 2.x 对基于 Java 8+ 构建的 1.x 代码库进行了大量重写。除了解决 TLS 1.3 问题之外,它还包含了许多更新,例如更高的一致性、易用性和强制实施的不变性。  请访问我们的迁移指南,查看版本 2.x 中的所有新的主要功能,以及有关如何将代码从版本 1.x 迁移到版本 2.x 的指导信息。

选项 3(短期解决方法):暂时在启用 SDK 的协议中省略 TLS 1.3。

我们知道您可能无法立即将应用程序升级到适用于 Java 的 SDK 版本 1.12.x 或 2.x。例如,您使用的第三方库可能在后台使用了一个受影响的版本。在这些情况下,您可以使用 jdk.tls.client.protocols 系统属性暂时从启用的协议中显式省略 TLS 1.3。例如,从命令行运行以下命令将仅启用 TLS 1.2:

java -Djdk.tls.client.protocols="TLSv1.2" -jar my-app.jar

请注意,在将应用程序升级到适用于 Java 的 SDK 版本 1.12.x 或 2.x 时,建议将此选项作为短期解决方法,因为它将阻止使用更新、更安全的 TLS 版本。

使用 AWS CloudTrail Lake 可在 AWS 账户中查找带受影响版本的应用程序

AWS CloudTrail Lake 可用于查询由 CloudTrail 记录的事件。执行以下步骤创建数据湖,该数据湖可用于查找由应用程序使用的 SDK 版本:

  1. 创建 CloudTrail 数据湖。请参见用户指南以创建事件数据存储。
  2. 创建数据存储后,记录的正文将包含字段,这些字段可用于确定请求的操作以及发出请求的时间和位置。有关详细信息,请参见 CloudTrail 记录内容的用户指南
  3. 请遵循用户指南以查询和保存查询结果

记录中的“userAgent”字段包含用于发出请求的 Agent 的 SDK 版本。此字段可用于查找使用了受影响版本的应用程序。下面是一个示例查询,用于查找从 2022 年 11 月 19 日起使用 Java SDK 1.9.x 和 1.10.x 版本为 EventDatastoreID sample-Data-Store-Id 发出的所有请求。

select userIdentity, eventSource, awsRegion,
    eventName, eventType, eventTime, userAgent,
    requestParameters, sourceIPAddress 
 from sample-Data-Store-Id
where eventTime > '2022-11-19 00:00:00'
and userAgent like '%aws-sdk-java/1.9.%'
or userAgent like '%aws-sdk-java/1.10. %'
order by eventTime desc

请注意,示例查询还会产生有关未受直接影响的版本的潜在结果,因为该查询还将找到低于版本 1.9.5 和高于版本 1.10.31 的版本。

如果您有任何问题或疑虑,可以在 Github 上联系我们



Original URL: https://aws.amazon.com/cn/blogs/developer/tls-1-3-incompatibility-with-aws-sdk-for-java-versions-1-9-5-to-1-10-31/