HttpClient 在 jdk7 下访问一个网站始终发生 connection reset。切换到 jdk8 之下就正常。

2016-02-27 10:51:30 +08:00
 professorz

用 java 写的爬虫,用 httpclient 发送 post 请求,在 jdk7 下每次都会遇到 connection reset , jdk 切换成 jdk8 下没有问题。我试了一下,发现对于这个网站,只要是在 jdk7 的环境下, httpclient 发的请求都会被 connection reset ,而 jdk8 环境下就不会。 引用的 httpclient 是 4.3.6 版本,为什么两种不同的 jdk 之下会有这样的差别,求指点一二。

DefaultHttpClient httpClient = HttpTools.getHttpClient("");
enableSSL( httpClient);
String testurl = "https://book.flypeach.com";
HttpGet httpGet = new HttpGet(testurl);
HttpResponse httpResponse = httpClient.execute( httpGet);
System.out.println("status:" + httpResponse.getStatusLine());


public static void enableSSL(HttpClient httpclient) {
    try {
        SSLContext sslcontext = SSLContext.getInstance("TLS");
        sslcontext.init(null, new TrustManager[] { truseAllManager }, null);
      SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
      sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
      Scheme https = new Scheme("https", sf, 443);
      httpclient.getConnectionManager().getSchemeRegistry()
        .register( https);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
9727 次点击
所在节点    Java
8 条回复
qgy18
2016-02-27 11:02:23 +08:00
可能是 clienthello 中的 cipersuites 不一样,导致 tls 协商失败。 Wireshark 抓包看下就知道了。
wzxjohn
2016-02-27 11:06:00 +08:00
https://www.ssllabs.com/ssltest/analyze.html?d=book.flypeach.com
https://www.ssllabs.com/ssltest/viewClient.html?name=Java&version=7u25
因为服务端为了保证安全, Java 7 支持的不太安全的 SSL Cipher Suites 全都没有支持,所以你当然
connection reset 了。。。
professorz
2016-02-27 11:39:28 +08:00
@qgy18
@wzxjohn
感谢!这个 SSL Cipher Suites 是 jdk 层面上的是吧?不能在应用(代码)层面修改吗?
SoloCompany
2016-02-27 13:13:48 +08:00
professorz
2016-02-27 13:20:25 +08:00
@SoloCompany 谢谢,唔,看了看, jdk7 不支持 TLS_DH_anon_WITH_AES_128_GCM_SHA256 ,而这个网站就是用的这个。。除了换 JDK8 没办法啦?
SoloCompany
2016-02-27 14:00:32 +08:00
@professorz 主要的问题是在于 Java 7 没有支持 AES GCM 加密,你可以试一下第三方的 Bouncy Castle 库是否能解决 https://www.bouncycastle.org
salmon5
2016-02-27 14:27:21 +08:00
协议也不支持, jdk7 只支持 TLSv1 ,这个网站 https://book.flypeach.com 只支持 TLSv1.1 和 TLSv1.2 。
换 jdk8 吧,或者不用 java 。

个人经验觉得 https://book.flypeach.com 这个网站,管理员是为了安全,但是也是一知半解配置不当。
没有哪个商业网站敢这样配置的。
qgy18
2016-02-27 15:02:38 +08:00
@salmon5 是啊,这样一知半解的人太多了!上次还吐槽过阿里云的某个配置。

http://v2ex.com/t/251037

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259455

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX