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

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

💡 原文中文,约3400字,阅读约需8分钟。
📝

内容提要

AWS致力于提高Java应用程序的性能和安全性,但旧版本的AWS SDK与TLS 1.3不兼容。建议升级到1.12.x或2.x版本的AWS SDK或暂时省略TLS 1.3。使用Maven插件和CloudTrail Lake来确定是否受影响。

🔎

延伸解读

影响条件与潜在风险

应用程序受影响需同时满足两个条件:使用 AWS SDK for Java 1.9.5 至 1.10.31 版本,且 JDK 默认启用 TLS 1.3 或通过系统属性显式启用。若仅满足第一个条件,未来升级 JDK 到默认启用 TLS 1.3 的版本(如 Java 8 自 2022 年 7 月 19 日起,JDK 11 及以上自 2022 年 5 月 11 日起)时,应用也可能突然失败。因此,即使当前未启用 TLS 1.3,也需提前规划 SDK 升级。

升级选项的权衡

AWS 提供三种应对方式:升级到 SDK 1.12.x 或更高版本、升级到 2.x,或暂时禁用 TLS 1.3。升级到 1.12.x 最轻松,但需注意 1.9.x、1.10.x 和 1.12.x 之间存在破坏性变更,例如 1.10.x 及以上默认启用限制重试,并移除了部分公共 API,必须仔细测试。升级到 2.x 是推荐选项,它是对 1.x 代码库的大量重写,解决了 TLS 1.3 问题,并带来更高一致性、易用性和强制不变性,但迁移成本可能较高。

短期解决方法的局限

若无法立即升级,可通过设置 jdk.tls.client.protocols 系统属性暂时省略 TLS 1.3,例如 java -Djdk.tls.client.protocols="TLSv1.2" -jar my-app.jar。这能快速恢复连接,但会阻止使用更新、更安全的 TLS 版本,因此仅建议作为短期解决方法。长期来看,仍应升级到 SDK 1.12.x 或 2.x,以兼顾安全性与兼容性。

排查与监控建议

可使用 Maven 依赖插件运行 mvn dependency:tree 检查 aws-java-sdk-core 版本,并用 java -version 确认 JDK 是否启用 TLS 1.3,注意需调用实际运行应用的 Java 可执行文件。此外,SDK 版本和 JDK 版本会包含在 HTTP 请求的 User-Agent 标头中,可通过 CloudTrail Lake 查询 userAgent 字段来发现使用受影响版本的应用程序。示例查询可查找特定时间后使用 1.9.x 和 1.10.x 版本的请求,但需注意查

❓

Q&A

哪些版本的AWS SDK与TLS 1.3不兼容?

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

如何检查我的应用程序是否使用受影响的AWS SDK版本?

可以使用Maven命令'mvn dependency:tree'来检查当前使用的AWS SDK版本。

如果我的应用程序受到影响,我该如何解决?

建议将应用程序升级到AWS SDK 1.12.x或2.x版本,或者暂时省略TLS 1.3。

AWS SDK 2.x相比于1.x有什么优势?

AWS SDK 2.x进行了大量重写,提供更高的一致性、易用性,并解决了TLS 1.3问题。

如何使用AWS CloudTrail Lake查询受影响的应用程序?

可以创建CloudTrail数据湖并查询记录的事件,使用'userAgent'字段查找受影响的SDK版本。

短期解决方案是什么?

短期解决方案是暂时在启用的协议中省略TLS 1.3,例如通过设置jdk.tls.client.protocols属性。

🏷️

标签

➡️

继续阅读