
用 java 写的爬虫,用 httpclient 发送 post 请求,在 jdk7 下每次都会遇到 onnection 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(); } } 1 qgy18 2016-02-27 11:02:23 +08:00 via iPhone 可能是 clienthello 中的 cipersuites 不一样,导致 tls 协商失败。 Wireshark 抓包看下就知道了。 |
2 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 了。。。 |
3 professorz OP |
4 SoloCompany 2016-02-27 13:13:48 +08:00 |
5 professorz OP @SoloCompany 谢谢,唔,看了看, jdk7 不支持 TLS_DH_anon_WITH_AES_128_GCM_SHA256 ,而这个网站就是用的这个。。除了换 JDK8 没办法啦? |
6 SoloCompany 2016-02-27 14:00:32 +08:00 @professorz 主要的问题是在于 Java 7 没有支持 AES GCM 加密,你可以试一下第三方的 Bouncy Castle 库是否能解决 https://www.bouncycastle.org |
7 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 这个网站,管理员是为了安全,但是也是一知半解配置不当。 没有哪个商业网站敢这样配置的。 |
8 qgy18 2016-02-27 15:02:38 +08:00 |