Java SSLSocket双工关闭失败

Java SSLSocket双工关闭失败,java,ssl,socketexception,Java,Ssl,Socketexception,我得到以下例外情况: 我真的很困惑这个错误是从哪里出来的。也在寻找同样的东西,发现这表明这个日志记录有误导性。我在openJDK11和更高版本中经历了这种行为,这似乎是因为Java 11中新实现了SSL/TLS通道以支持TLSv1.3。当它被称为同时支持TLSv1.3的服务器时,会注意到一个错误,JVM试图使用这个协议打开一个通道,但运气不佳,显然它还没有得到完全支持 我在OpenJDK11中发现了一个有用的解决方法,强制使用TLSv1.2,只需在应用程序启动时向JVM添加以下选项:-Djdk.

我得到以下例外情况:


我真的很困惑这个错误是从哪里出来的。

也在寻找同样的东西,发现这表明这个日志记录有误导性。

我在openJDK11和更高版本中经历了这种行为,这似乎是因为Java 11中新实现了SSL/TLS通道以支持TLSv1.3。当它被称为同时支持TLSv1.3的服务器时,会注意到一个错误,JVM试图使用这个协议打开一个通道,但运气不佳,显然它还没有得到完全支持

我在OpenJDK11中发现了一个有用的解决方法,强制使用TLSv1.2,只需在应用程序启动时向JVM添加以下选项:-Djdk.tls.client.protocols=TLSv1.2-Dhttps.protocols=TLSv1.2

请注意,此解决方案并不总是有效的,它还取决于您的java代码和使用的LIB

第二种方法是降级到Jdk1.8,默认版本中不支持TLSv1.3,但并不总是可能

如果您想更详细地研究TLS握手,还可以在启动时添加以下JVM参数:-Djavax.net.debug=ssl了解更多详细信息,请将其设置为all

编辑 从2021年2月起,当存储库向TLSv1.3添加了支持时,我在openJDK11上的Jenkins插件管理器的更新过程中最初遇到了这个错误。在调查该问题的过程中,我发现并使用jdk11尝试了以下代码:

通过使用java-Djavax.net.debug=ssl DownloadWebpageExample运行它,它会给出如下错误:

javax.net.ssl|DEBUG|01|main|2021-06-11 12:40:59.499 CEST|SSLSocketImpl.java:636|close inbound of SSLSocket
javax.net.ssl|WARNING|01|main|2021-06-11 12:40:59.501 CEST|SSLSocketImpl.java:494|SSLSocket duplex close failed (
"throwable" : {
  java.net.SocketException: Socket is closed
        at java.base/java.net.Socket.shutdownInput(Socket.java:1521)
通过使用java-Djdk.tls.client.protocols=TLSv1.2-Dhttps.protocols=TLSv1.2-Djavax.net.debug=ssl DownloadWebpageExample执行它并不能解决问题。我在许多jdk版本中尝试了这段代码,发现jdk8和openJDK9不受此行为的影响,但它在openJDK11-16中。 在Jenkins中,我注意到了一种不同的行为,通过在/etc/sysconfig/Jenkins文件中添加如下参数,解决了openJDK11的问题。对我来说,这是确认错误也取决于源代码实现:

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Djdk.tls.client.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2"

它“出来”是因为你试图关闭一个已经关闭的插座。错误消息非常清楚。不同的消息。您的链接是关于“套接字未连接”。不相关,请提供证据。
javax.net.ssl|DEBUG|01|main|2021-06-11 12:40:59.499 CEST|SSLSocketImpl.java:636|close inbound of SSLSocket
javax.net.ssl|WARNING|01|main|2021-06-11 12:40:59.501 CEST|SSLSocketImpl.java:494|SSLSocket duplex close failed (
"throwable" : {
  java.net.SocketException: Socket is closed
        at java.base/java.net.Socket.shutdownInput(Socket.java:1521)
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Djdk.tls.client.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2"