记一次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干掉即可

4. 最后

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

Ignoring disabled protocol: SSLv3

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

上一篇:用JS实现excel预览


下一篇:2020-07-02:在浏览器输入一个url后按回车,会发生什么?