内容提要
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属性。