如何忽略Apache HttpClient 4.3的SSL证书(全部信任)?
我在SO上找到的所有答案都会处理以前的版本,并且API已更改 .
有关:
-
How to ignore SSL certificate errors in Apache HttpClient 4.0
-
How to handle invalid SSL certificates with Apache HttpClient?
-
Need to trust all the certificates during the development using Spring
编辑:
- 仅用于测试目的 . 孩子们,不要在家里(或在 生产环境 中)尝试
14 回答
以下代码适用于信任自签名证书 . 创建客户端时必须使用TrustSelfSignedStrategy:
我没有故意包含
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
:重点是允许使用自签名证书进行测试,这样您就不必从证书颁发机构获取适当的证书 . 您可以使用正确的主机名轻松创建自签名证书,这样做而不是添加SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
标志 .如果您使用上面的PoolingHttpClientConnectionManager过程不起作用,则忽略自定义SSLContext . 创建PoolingHttpClientConnectionManager时,必须在构造函数中传递socketFactoryRegistry .
作为@mavroprovato答案的补充,如果你想信任所有证书而不仅仅是自签名,那么(你的代码风格)
或(从我自己的代码直接复制粘贴):
如果你想跳过主机名验证,你需要设置
同样 . (不推荐使用ALLOW_ALL_HOSTNAME_VERIFIER) .
强制警告:你不应该这样做,接受所有证书是一件坏事 . 但是,有一些罕见的用例需要执行此操作 .
作为前面给出的代码的注释,即使httpclient.execute()抛出异常,您也希望关闭响应
上面的代码使用了测试
感兴趣的是,这是我的完整测试集:
(工作测试项目in github)
vasekt给出的一个小补充:
使用PoolingHttpClientConnectionManager时,提供的SocketFactoryRegistry解决方案可以正常工作 .
但是,通过普通http的连接不再起作用 . 您还必须为http协议添加一个PlainConnectionSocketFactory,以使它们再次工作:
尝试各种选项后,以下配置适用于http和https
我使用的是http-client 4.3.3 -
compile 'org.apache.httpcomponents:httpclient:4.3.3'
更简单,更短的工作代码:
使用http客户端4.5时,我必须使用javasx.net.ssl.HostnameVerifier来允许任何主机名(用于测试目的) . 这是我最终做的事情:
这是上述技术的工作升级,相当于“curl --insecure”:
在
PoolingHttpClientConnectionManager
之上以及Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
如果你想使用PoolingNHttpClientConnectionManager
的异步httpclient,代码应该类似于以下如果您使用的是 HttpClient 4.5.x ,则您的代码可能类似于以下内容:
(我会直接在vasekt的答案中添加评论,但我没有足够的声望点(不确定那里的逻辑)
无论如何...我想说的是,即使你没有明确地创建/要求PoolingConnection,也不意味着你没有得到它 .
我疯狂地想弄清楚为什么原来的解决方案不适合我,但我忽略了vasekt的答案,因为它“不适用于我的情况” - 错了!
我低时盯着我的堆栈跟踪,看到我在它的中间看到了一个PoolingConnection . 砰 - 我累了他的补充和成功! (我们的演示是明天,我变得绝望):-)
信任Apache HTTP客户端中的所有证书
您可以使用以下代码段来获取没有ssl认证检查的HttpClient实例 .