带有TLS 1.3的Java 11 SSLHandshakeException:如何恢复到TLS 1.2?

2022-05-29 00:00:00 ssl tls1.2 java-11 java

我的应用程序是一种"Web Screper"形式,它使用the Java Jsoup library从所需的输入页面加载HTML。我最近将我的应用程序平台从Java 8升级到Java 11。在这次升级中,我收到了几个来自我的客户的报告,他们说他们在试图加载某些网页的HTML内容时收到SSLHandshakeExceptions。发生这些情况的网页因设备而异,并且在某些设备上,我的客户端根本无法加载任何网页(既不能加载http://也不能加载http://网页)。

我尝试了几种方法来解决这个问题,但都无济于事:

  1. 用Java 8运行时的CACERT文件替换Java 11运行时的CACERT文件
  2. 创建自定义的SSL证书接受器,该证书接受器接受所有的SSL证书,而不考虑其有效性(我知道这不利于生产代码,但这只是出于测试目的)-请参阅Trusting all certificates using HttpClient over HTTPS
在这一点上,我真的不确定要采取什么选项,因为我对SSL、TLS和HTTPS的了解有限。这些错误在Java 8中从未发生过,在升级到Java 11之前一切正常。

据我所知,Java 11对SSL唯一的改变是升级到TLS 1.3,而之前的Java版本依赖于使用TLS 1.2。

因此,我想强制Java 11使用TLS 1.2而不是TLS 1.3,因为我认为这是SSLHandshakeExceptions的原因。我应该如何着手进行此操作?


解决方案

NeardupeJava 11 HTTPS connection fails with SSL HandshakeException while using Jsoup但我有一些要添加。

使用Connection.sslSocketFactory(factory)和合适的参数。假设使用标准/默认提供者,您可以使用从SSLContext.getInstance("TLSv1.2")创建的工厂,该工厂可能带有默认的信任管理器和密钥管理器,即.init(null,null,null)

或按the JSSE documentation中的表8-3设置jdk.tls.client.protocolshttps.protocols。注意:这可能会影响从同一JVM建立的任何其他SSL/TLS连接或用于HTTPS的其他URLConnection。

不过,如果这解决了您的问题,我会感到惊讶。TLS1.3被推迟了年,部分原因是他们添加了黑客攻击,以便不会在旧版1.2(甚至更早的)系统和‘盒’上失败。

相关文章