用 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();
}
}
1
qgy18 2016-02-27 11:02:23 +08:00 via iPhone 1
可能是 clienthello 中的 cipersuites 不一样,导致 tls 协商失败。 Wireshark 抓包看下就知道了。
|
2
wzxjohn 2016-02-27 11:06:00 +08:00 2
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 1
协议也不支持, 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
|