带有TLS 1.3的Java 11 SSLHandshakeException:如何还原为TLS 1.2?

时间:2020-03-31 16:21:06

标签: java ssl tls1.2 java-11

我的应用程序是“网页抓取工具”的一种形式,可使用the Java Jsoup library从所需的输入页面加载HTML。我最近将应用程序平台从Java 8升级到Java11。通过此升级,我收到了一些来自客户的报告,这些报告说他们在尝试加载某些网页的HTML内容时收到SSLHandshakeExceptions。这些网页出现在不同的设备上,并且在某些设备上,我的客户端根本无法加载任何网页(无论是http://还是https://网页)。

我尝试了几种解决方法,但无济于事:

  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的原因。我应该如何去做?

3 个答案:

答案 0 :(得分:3)

Neardupe Java 11 HTTPS connection fails with SSL HandshakeException while using Jsoup,但我要补充一些。

Connection.sslSocketFactory(factory)与合适的参数一起使用。假设使用标准/默认提供程序,则可以使用由SSLContext.getInstance("TLSv1.2")创建的工厂,可能带有默认的trustmanager和keymanager即.init(null,null,null)

或根据the JSSE documentation中表8-3设置jdk.tls.client.protocolshttps.protocols。请注意,这可能会影响来自同一JVM的任何其他SSL / TLS连接或HTTPS的其他URLConnection。

但是,如果这能解决您的问题,我会感到惊讶。 TLS1.3被延迟了,部分原因是因为它们添加了黑客,所以它在旧版1.2(甚至更早)的系统和“盒子”中不会失败。

>

答案 1 :(得分:3)

您还可以在Java客户端的命令行中定义jdk.tls.client.protocols=TLSv1.2

java -Djdk.tls.client.protocols=TLSv1.2 -jar ... <rest of command line here>

这将使您的客户端仅发布TLS 1.2版,即使您要连接的服务器支持TLS 1.3,也将使用该版本

答案 2 :(得分:0)

仅供参考: 这个 TLS1.3 错误是 JDK11 11.0.2 之前的一个已知错误。 https://bugs.openjdk.java.net/browse/JDK-8211806