【问题标题】:SocketException: Connection reset on JRE 1.6, not on JRE 11SocketException:JRE​​ 1.6 上的连接重置,而不是 JRE 11
【发布时间】:2019-12-08 13:44:05
【问题描述】:

我有一个相当老的 twitter 机器人,已经运行了几年没问题。它使用 twitter4j,在 JRE 1.6 上运行。两天前我突然开始收到 SocketExceptions:

Exception in thread "main" Connection reset
  Relevant discussions can be found on the Internet at:
  http://www.google.co.jp/search?q=7e95ed42 or
  http://www.google.co.jp/search?q=8a72206c
TwitterException{exceptionCode=[7e95ed42-8a72206c faf0771e-c3d1e8db], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.7}
  at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:185)
  at twitter4j.HttpClientBase.request(HttpClientBase.java:57)
  at twitter4j.HttpClientBase.get(HttpClientBase.java:75)
  at twitter4j.TwitterImpl.get(TwitterImpl.java:2084)
  at twitter4j.TwitterImpl.getFriendsList(TwitterImpl.java:808)
  at twitter4j.TwitterImpl.getFriendsList(TwitterImpl.java:803)
  at uk.co.twinance.Fetcher.getAvatars(Fetcher.java:167)
  at uk.co.twinance.Fetcher.run(Fetcher.java:103)
  at uk.co.twinance.Fetcher.main(Fetcher.java:203)
Caused by: java.net.SocketException: Connection reset
  at java.net.SocketInputStream.read(SocketInputStream.java:168)
  at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:422)
  at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:460)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
  at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
  at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
  at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
  at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
  at twitter4j.HttpResponseImpl.<init>(HttpResponseImpl.java:35)
  at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:149)
  ... 8 more

我在我的 linode 和两台运行 Ubuntu 11 和 18 的家用笔记本电脑上得到了这个,我得到了每个请求的异常。

经过一番折腾,我发现如果我将运行时切换到 JRE 11,它可以完美运行!没有例外。

所以 - 我猜 Twitter 端的某些东西最近发生了变化(鉴于该问题在 3 台机器上可重现),但我不知道 JRE 如何以会导致问题的方式影响网络请求用推特。

有什么想法吗?

【问题讨论】:

  • JRE 6 将使用旧版本的 SSL/TLS 协议和/或旧的加密算法。通过在 JRE 中打开 SSL 调试,您可以更深入地了解正在发生的事情;例如docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/…。显然 Twitter 最近关闭了对 TLS 1.0 和 1.1 的支持 - thesslstore.com/blog/…
  • 简单的解决方案是停止使用 Java 6。它在很久以前就被淘汰了。公开发布于 2013 年 4 月停止。那是六年前的事了。 “扩展支持”于 2018 年 12 月结束。
  • @StephenC - 有道理,谢谢。如果您作为答案,我会接受。是的,我需要更新。迄今为止的政策是,如果没有损坏,请不要修复它:)

标签: java runtime twitter4j socketexception


【解决方案1】:

您的问题是以下问题的组合:

  1. Java 6.0 仅支持最高 TLS1.0 的 SSL/TLS;见How to use TLS 1.2 in Java 6

  2. 2019 年 7 月 15 日星期一,Twitter 在其公共 API 中关闭了对 TLS 1.0 和 TLS 1.1 的支持。 (来源https://www.thesslstore.com/blog/twitter-will-deprecate-support-for-tls-1-0-tls-1-1-on-july-15/

总而言之,这就解释了为什么您的基于 Java 6 的 twitter 机器人最近停止工作。


请注意,Java 6.0 已经结束。公开更新于 2013 年 4 月结束。甚至 Oracle 对 Java 6.0 的“扩展支持”选项也于 2018 年 12 月停止。

(来源:https://www.oracle.com/technetwork/java/java-se-support-roadmap.html

因此,解决您的问题的最佳方法是更新您的 twitter 机器人运行的 Java 平台。 (事实证明,升级很简单。)

升级 Java 有另一个好处。您将在您的 Java 平台上应用大约 6 年积累的安全补丁、错误修复和性能增强。


另请注意,TLS 1.2 于 2008 年完成。最新版本是 TLS 1.3(于 2018 年完成)。 TLS 1.0 和 TLS 1.1 将于 2020 年正式弃用。

(来源https://en.wikipedia.org/wiki/Transport_Layer_Security

这种关键互联网标准(如 SSL/TLS)的不断发展是另一个建议不要让您的 Java 平台落后太多的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2010-09-20
    相关资源
    最近更新 更多