web-dev-qa-db-ja.com

apache httpclient 4.4:4.3.xからのHostnameVerifierの移行

HttpClient 4.3には、org.Apache.http.conn.ssl.SSLConnectionSocketFactoryに3つの静的変数がありました。

  1. STRICT_HOSTNAME_VERIFIER
  2. BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
  3. ALLOW_ALL__HOSTNAME_VERIFIER

依存関係をHttpClientのバージョン4.4にアップグレードすると、上記の定数がすべて非推奨になっていることがわかります。 org.Apache.http.conn.ssl.DefaultHostnameVerifierの使用について言及されているJavaDocの非推奨ノート。ドキュメントを読むと、DefaultHostnameVerifierSTRICT_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」など)が「a.b.foo.com」を含むすべてのサブドメインに一致することです。

Httpclient4.4用にすぐに利用できるBROWSER_COMPATIBLEホスト名ベリファイアはありますか?

15

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

2番目の方法では、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

お役に立てれば。

7
vzamanillo

実際、 AllowAllHostnameVerifier のjavadocは、ALLOW_ALL__HOSTNAME_VERIFIERの直接の置換を提供します。これは NoopH​​ostnameVerifier です。

7
lvaills

BrowserCompatHostnameVerifierは本質的にIE 5/6互換性のある実装でした。実際に最新のブラウザアプリケーションと互換性があるかどうかはわかりません。BrowserCompatHostnameVerifierはに存在するべきではありませんでした。そもそも、もう使用すべきではありません。

1
ok2c

私はこれをすべて読みましたが、何もうまくいきませんでした。これが私の一日を救ったものです: https://stackoverflow.com/a/36507502/3090309

私が使用していた:

compile group: 'org.Apache.httpcomponents', name: 'httpclient', version: '4.5.2'
0
camposer