繁体   English   中英

apache httpclient 4.4:HostnameVerifier从4.3.x过渡

[英]apache httpclient 4.4: HostnameVerifier transition from 4.3.x

HttpClient 4.3在org.apache.http.conn.ssl.SSLConnectionSocketFactory有三个静态变量:

  1. STRICT_HOSTNAME_VERIFIER
  2. BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
  3. ALLOW_ALL__HOSTNAME_VERIFIER

将依赖项升级到HttpClient的4.4版时,我看到所有上述常量都已弃用。 JavaDoc中的弃用说明提到使用org.apache.http.conn.ssl.DefaultHostnameVerifier 阅读文档,我假设DefaultHostnameVerifierSTRICT_HOSTNAME_VERIFIER的直接替代STRICT_HOSTNAME_VERIFIER ALLOW_ALL__HOSTNAME_VERIFIER也很容易实现:

package org.wiztools.restclient.http;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

/**
 *
 * @author subwiz
 */
public class AllowAllHostnameVerifier implements HostnameVerifier {

    @Override
    public boolean verify(String string, SSLSession ssls) {
        return true;
    }

}

STRICT_HOSTNAME_VERIFIERBROWSER_COMPATIBLE_HOSTNAME_VERIFIER (来自JavaDoc)之间有一个微妙的区别:

BROWSER_COMPATIBLE和STRICT之间的唯一区别是带有BROWSER_COMPATIBLE的通配符(例如“* .foo.com”)匹配所有子域,包括“abfoo.com”。

我们是否为httpclient 4.4提供了一个随时可用的BROWSER_COMPATIBLE主机名验证程序?

实际上, AllowAllHostnameVerifier的javadoc直接替换了ALLOW_ALL__HOSTNAME_VERIFIER ,即NoopH​​ostnameVerifier

您不需要AllowAllHostnameVerifier的新实现类,也不需要BrowserCompatHostnameVerifier其他实现,只需将实例传递给新的DefaultHostnameVerifier

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new DefaultHostnameVerifier());

本类使用以下方法签名的必要验证方法

public final boolean verify(String host, SSLSession session) (Override)

public final void verify(String host, X509Certificate cert) throws SSLException

在第二种方法中,httpcomponents检查匹配的子域

public final void verify(String host, X509Certificate cert) throws SSLException {
    boolean ipv4 = InetAddressUtils.isIPv4Address(host);
    boolean ipv6 = InetAddressUtils.isIPv6Address(host);
    int subjectType = ((ipv4) || (ipv6)) ? 7 : 2;
    List subjectAlts = extractSubjectAlts(cert, subjectType);
    if ((subjectAlts != null) && (!(subjectAlts.isEmpty()))) {
        if (ipv4)
            matchIPAddress(host, subjectAlts);
        else if (ipv6)
            matchIPv6Address(host, subjectAlts);
        else {
            matchDNSName(host, subjectAlts, this.publicSuffixMatcher);
        }
    } else {
        X500Principal subjectPrincipal = cert.getSubjectX500Principal();
        String cn = extractCN(subjectPrincipal.getName("RFC2253"));
        if (cn == null) {
            throw new SSLException("Certificate subject for <" + host + "> doesn't contain " + "a common name and does not have alternative names");
        }

        matchCN(host, cn, this.publicSuffixMatcher);
    }
}

请查看源代码以获得更多说明

org.apache.http.conn.ssl.DefaultHostnameVerifier

希望这可以帮助。

BrowserCompatHostnameVerifier本质上是IE 5/6兼容的实现。 我不确定它是否真的与更现代的浏览器应用程序兼容。 BrowserCompatHostnameVerifier应该从未存在过,不应该再使用了。

我读了这一切,没有什么对我有用,这就是节省我的一天: https//stackoverflow.com/a/36507502/3090309

我用的是:

compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM