【问题标题】:How to make Apache Commons HttpClient 3.1 ignore HTTPS certificate invalidity?如何使 Apache Commons HttpClient 3.1 忽略 HTTPS 证书无效?
【发布时间】:2011-10-07 08:18:23
【问题描述】:

我试图让 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 所证明的那样)。

我确实找到了 Make a connection to a HTTPS server from Java and ignore the validity of the security certificateDisable 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。当我使用稍微调整过的版本时,第二页的代码似乎根本没有任何效果(基本上,以旧方式声明类而不是使用内联匿名类,以及适用于TLS SSL,使用 SSL 作为示例代码中的默认 HTTPS 套接字工厂)。

最好是线程/实例范围的东西,以便在我的 servlet 代码中创建任何 HttpClient 实例(和/或相关类)不是在同一个容器中运行的另一个 servlet)将使用松散的证书验证逻辑,但此时我开始觉得只要它接受自签名证书为有效,任何事情都会做。

是的,我知道存在安全隐患,但我需要它的唯一原因是出于测试目的。这个想法是实现一个配置选项来控制通常不受信任的证书是否受信任,并将其保留为“不信任不信任的服务器证书”作为默认值。这样,它可以在开发中轻松打开或关闭,但在生产中执行此操作将需要竭尽全力。

【问题讨论】:

    标签: java https httpclient apache-commons


    【解决方案1】:

    为了接受自签名证书,我们对来自 commons http 客户端的特定 HttpConnection 使用以下代码。

    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。

    【讨论】:

    • 是的,3.1 已经弃用了您举例说明的协议构造函数,并且显然根本没有 HttpConnection#setProtocol 方法。可惜,它看起来确实很有希望。 :(
    • 构造函数在 3.0.1 中也被弃用了 ;) 根据 apache 源代码库 HttpConnection 在 3.1 中仍然有一个 setProtocol 方法:svn.apache.org/viewvc/httpcomponents/oac.hc3x/tags/…
    • 工厂可以转换为ProtocolSocketFactory,这只是一个向上转换,因此如果他们删除了不推荐使用的构造函数,那么它现在已经使用了非弃用的构造函数,我会更新我的发布。
    • 哎呀,我不知道是什么让我这样做,但实际上我在查看 HttpClient#setProtocol 时认为是 HttpConnection#setProtocol。就我而言,我什至不能把它归咎于没有足够的咖啡。将再次尝试看看我是否可以在我拥有的代码框架中完成这项工作......
    • 我担心这样的事情会发生在我们所有人身上 ;) 在调整 HttpClient 时,我认为可以提供HttpConnectionManager 的包装版本。
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2011-02-11
    • 2015-03-13
    • 2012-08-18
    • 2017-02-16
    • 2021-11-21
    • 2017-12-17
    相关资源
    最近更新 更多