我得到以下例外:
javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.355 javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:1569|close javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:1569|close底层套接字javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:1588|close javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:727|close of SSLSocket javax.net.ssl|WARNING|79|Keep-活动计时器(2021-03-29) 23:34:12.356 PDT|SSLSocketImpl.java:500|SSLSocket双工关闭失败( "throwable“:{ java.net.SocketException: Socket在java.base/sun.security.ssl.BaseSSLSocketImpl.shutdownInput(BaseSSLSocketImpl.java:216) at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:742) at java.base/sun.security.ssl.SSLSocketImpl.bruteForceCloseInput(SSLSocketImpl.java:692) at java.base/sun.security.ssl.SSLSocketImpl.duplexCloseOutput(SSLSocketImpl.java:553) at java.base/sun.security.ssl.SSLSocketImpl.close(SSLSocketImpl.java:485) at java.base/sun.net.www.http.HttpClient.closeServer(HttpClient.java:1058) at java.base/sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:183) atjava.base/java.lang.Thread.run(Thread.java:834) at java.base/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134) }
我真的很困惑这个错误是从何而来的。
发布于 2021-06-11 09:51:36
我在openJDK11和更高版本中经历了这种行为,这似乎是由于Java11中的SSL/TLS通道的新实现,以支持TLSv1.3。这个错误--当它被称为也支持TLSv1.3的服务器时,JVM尝试使用这个协议打开一个通道,显然它还没有完全被支持。
通过强制TLSv1.2,我找到了一个解决方法(在OpenJDK11中很有用),只需在应用程序启动时向JVM添加以下选项:-Djdk.tls.client.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2
注意,这个解决方案并不总是有效的,它也取决于您的java代码和使用的lib。
第二种方法是降级到but 1.8,默认情况下构建不支持TLSv1.3,但这并不总是可能的。
如果希望更详细地研究TLS握手,在启动时还添加以下JVM参数:-Djavax.net.debug=ssl
(有关将其设置为all
的更多详细信息)
编辑
从02/2021开始,当存储库向TLSv1.3 (https://updates.jenkins.io)添加支持时,在“外接程序管理器”中的更新过程中,我最初在Jenkins上遇到了这个错误。在调查这个问题期间,我发现并尝试了以下jdk11代码詹金斯问题报告
public class DownloadWebpageExample {
public static void main(String[] args) {
try {
URL url = new URL("https://updates.jenkins.io/download/plugins/plugin-util-api/1.2.5/plugin-util-api.hpi");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
readStream(con.getInputStream());
// Give output for the command line
} catch (Exception e) {
e.printStackTrace();
}
}
private static void readStream(InputStream in)
{
char[] buf = new char[1024];
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in));) {
while (reader.read(buf, 0, 1024) != -1) { }
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过使用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"
发布于 2021-04-22 09:12:18
正在寻找同样的东西,找到了https://bugs.openjdk.java.net/browse/JDK-8255148,这表明这个日志记录是误导的。
https://stackoverflow.com/questions/66866105
复制相似问题