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