【问题标题】:SSLSocket duplex close failedSSLSocket 双工关闭失败
【发布时间】:2021-03-30 06:58:14
【问题描述】:

我收到以下异常:

javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.355 PDT|SSLSocketImpl.java:479|duplex close of SSLSocket<br>
javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:1569|close the underlying socket<br>
javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:1588|close the SSL connection (initiative)<br>
javax.net.ssl|DEBUG|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:727|close inbound of SSLSocket<br>
javax.net.ssl|WARNING|79|Keep-Alive-Timer|2021-03-29 23:34:12.356 PDT|SSLSocketImpl.java:500|SSLSocket duplex close failed (
"throwable" : { 
    java.net.SocketException: Socket is closed
  at java.base/java.net.Socket.shutdownInput(Socket.java:1538)
      at 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)
      at java.base/java.lang.Thread.run(Thread.java:834)
      at java.base/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
}

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

【问题讨论】:

  • 它'出来'是因为你试图关闭一个你已经关闭的套接字。错误信息很清楚。

标签: java ssl socketexception


【解决方案1】:

我在使用 openJDK11 及更高版本时遇到了这种行为,这似乎是由于 Java 11 中新实现了 SSL/TLS 通道以支持 TLSv1.3。当它被称为也支持TLSv1.3的服务器时注意到的错误,JVM尝试使用该协议打开通道但没有运气,显然它还没有完全支持。

我通过强制 TLSv1.2 找到了一种解决方法(在 OpenJDK11 中很有用),只需在应用程序启动时将以下选项添加到 JVM:-Djdk.tls.client.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2

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

第二种方法是降级到 Jdk1.8,默认构建不支持 TLSv1.3,但并不总是可行。

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

编辑

我最初在 Jenkins 上的 openJDK11 中在从 02/2021 更新“插件管理器”期间遇到此错误,当时存储库添加了对 TLSv1.3 的支持 (https://updates.jenkins.io)。在调查问题期间,我发现并尝试使用 jdk11 使用以下代码from jenkins issue report

 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"

【讨论】:

  • 请提供证据。
【解决方案2】:

一直在寻找相同的东西,发现 https://bugs.openjdk.java.net/browse/JDK-8255148 这表明此日志记录具有误导性。

【讨论】:

  • 不同的消息。您的链接是关于“套接字未连接”的。不相关。
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多