V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
professorz
V2EX  ›  Java

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

  •  1
     
  •   professorz · 2016-02-27 10:51:30 +08:00 · 9546 次点击
    这是一个创建于 2952 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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();
        }
    }
    
    8 条回复    2016-02-27 15:02:38 +08:00
    qgy18
        1
    qgy18  
       2016-02-27 11:02:23 +08:00 via iPhone   ❤️ 1
    可能是 clienthello 中的 cipersuites 不一样,导致 tls 协商失败。 Wireshark 抓包看下就知道了。
    wzxjohn
        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 了。。。
    professorz
        3
    professorz  
    OP
       2016-02-27 11:39:28 +08:00
    @qgy18
    @wzxjohn
    感谢!这个 SSL Cipher Suites 是 jdk 层面上的是吧?不能在应用(代码)层面修改吗?
    professorz
        5
    professorz  
    OP
       2016-02-27 13:20:25 +08:00
    @SoloCompany 谢谢,唔,看了看, jdk7 不支持 TLS_DH_anon_WITH_AES_128_GCM_SHA256 ,而这个网站就是用的这个。。除了换 JDK8 没办法啦?
    SoloCompany
        6
    SoloCompany  
       2016-02-27 14:00:32 +08:00
    @professorz 主要的问题是在于 Java 7 没有支持 AES GCM 加密,你可以试一下第三方的 Bouncy Castle 库是否能解决 https://www.bouncycastle.org
    salmon5
        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 这个网站,管理员是为了安全,但是也是一知半解配置不当。
    没有哪个商业网站敢这样配置的。
    qgy18
        8
    qgy18  
       2016-02-27 15:02:38 +08:00
    @salmon5 是啊,这样一知半解的人太多了!上次还吐槽过阿里云的某个配置。

    http://v2ex.com/t/251037
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   960 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:35 · PVG 04:35 · LAX 13:35 · JFK 16:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.