• 记一次HttpClient+jdk8调用SSLv3接口的问题


    1. 环境

    org.apache.httpcomponents.httpclient 4.5.10版本 + jdk1.8_202版本

    2. 问题

    需要用HttpClient调用https接口,该https服务器只支持SSLv3,调用时报错:Received fatal alert: handshake_failure

    3. 解决

    百度:铺天盖地的告诉我如何让HttpClient绕过SSL认证,包括类似下面的代码:赫然出现了SSLv3这样的关键字,然并卵

    ocketFactory = new SSLConnectionSocketFactory(
                        contextBuilder.build(),
                        new String[]{"TLSv1.2", "SSLv3", "TLSv1", "TLSv1.1"},
                        null, 
                        NoopHostnameVerifier.INSTANCE
                );

    后偶然看到需要更改jdk,因为jdk本身限制了SSLv3协议的使用,也有人说HttpClient根本就不管jdk那一套。遂跑去看源码:答案是,HttpClient还是符合jdk的设定的。于是解决办法为:找到你的jre/lib/security下的java.security文件,修改jdk.tls.disabledAlgorithms,把该项配置的SSLv3干掉即可。当然,上面这段代码还是需要的,详见org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket方法:关键代码已标红

    if (this.supportedProtocols != null) {
        sslsock.setEnabledProtocols(this.supportedProtocols);
    } else {
        allCipherSuites = sslsock.getEnabledProtocols();
        enabledCipherSuites = new ArrayList(allCipherSuites.length);
        arr$ = allCipherSuites;
        len$ = allCipherSuites.length;
    
        for(i$ = 0; i$ < len$; ++i$) {
            cipherSuite = arr$[i$];
            if (!cipherSuite.startsWith("SSL")) {
                enabledCipherSuites.add(cipherSuite);
            }
        }
        if (!enabledCipherSuites.isEmpty()) {
           sslsock.setEnabledProtocols((String[])enabledCipherSuites.toArray(new String[enabledCipherSuites.size()]));
        }
    }

    4. 最后

    只怪自己太垃圾。另附:开启ssl的bug日志:-Djavax.net.debug=ssl,当然也可以-Djavax.net.debug=all,开启后如果没有修改jdk配置,你会看到如下输出:

    Ignoring disabled protocol: SSLv3
  • 相关阅读:
    安卓远程工具介绍及下载地址
    kylinos-kysec介绍
    远程控制工具ToDesk介绍
    kylinos桌面和服务器系统重置密码
    APT仓库目录和repository目录结构
    使用LVM实现动态磁盘管理
    如何实现访问http自动跳转https
    TypeScript学习 ———— 四、泛型
    TypeScript学习 ———— 三、function
    TypeScript学习 ———— 二、接口
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/13445704.html
Copyright © 2020-2023  润新知