2011-10-07 116 views
7

我想加深对Apache Commons的HttpClient库(3.1版),以忽视的事实是服务器证书不能作为信任建立(被抛出的异常javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target证明)。如何使Apache Commons HttpClient 3.1忽略HTTPS证书无效?

我发现Make a connection to a HTTPS server from Java and ignore the validity of the security certificate以及Disable Certificate Validation in Java SSL Connections,但接受的答案首先是HttpClient的4.0(可惜我不能升级,除非有人能指出我如何使用两个不同版本的同一方向图书馆在同一个项目中),虽然它确实有another answer with little more than a dead link that supposedly went to a 3.x solution。当我使用稍微调整后的版本时(第二页的代码似乎没有任何效果)(基本上,以旧的方式声明类而不是使用匿名内联的类,以及除SSL之外的TLS,使用SSL作为示例代码中完成的默认HTTPS套接字工厂)。

最好,我想的东西,是thread- /实例范围,因此任何HttpClient实例(和/或相关的类)创建从我的servlet代码内另一个servlet中运行相同的容器)将使用宽松的证书验证逻辑,但是现在我开始觉得只要接受自签名证书的有效性,任何事情都会执行。

是的,我知道有安全隐患,但为什么我需要这在所有的唯一原因是用于测试目的。这个想法是实现一个配置选项,该选项控制通常不可信的证书是否可信,并将其保留为“不信任不可信的服务器证书”作为默认值。这种方式可以很容易地在开发中打开或关闭,但在生产中这样做需要走出困境。

回答

11

接受自签名的证书,我们使用下面的代码为特定HttpConnection从公共HTTP客户端。

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

EasySSLProtocolSocketFactory可以在contrib ssl包中找到。这可以用于仅使用降低的安全设置进行单一连接。 好像这也可以用于设置为每个客户端的协议如下所示:

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

但我认为这也将影响到其他的servlet的连接。

[编辑] 对不起,我不知道这是否会为你工作。只是认识到我们正在使用客户端3.0.1而不是3.1。

+0

是的,3.1已弃用您所举例的协议构造函数,并且显然没有HttpConnection#setProtocol方法。可惜,它确实看起来很有希望。 :( –

+0

的构造也被弃用3.0.1)根据apache的源代码库'HttpConnection'仍具有3.1'setProtocol'方法:http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

工厂可以转换为'ProtocolSocketFactory',这仅是一个上溯造型,因此没有必要的,如果它们删除废弃的构造,那么它现在已经使用了不推荐使用的构造函数,我会更新我的文章。 – Gandalf