HttpClient 4.3には、org.Apache.http.conn.ssl.SSLConnectionSocketFactory
に3つの静的変数がありました。
依存関係をHttpClientのバージョン4.4にアップグレードすると、上記の定数がすべて非推奨になっていることがわかります。 org.Apache.http.conn.ssl.DefaultHostnameVerifier
の使用について言及されているJavaDocの非推奨ノート。ドキュメントを読むと、DefaultHostnameVerifier
は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_VERIFIER
とBROWSER_COMPATIBLE_HOSTNAME_VERIFIER
(JavaDocから)の間には微妙な違いがあります。
BROWSER_COMPATIBLEとSTRICTの唯一の違いは、BROWSER_COMPATIBLEを含むワイルドカード(「* .foo.com」など)が「a.b.foo.com」を含むすべてのサブドメインに一致することです。
Httpclient4.4用にすぐに利用できるBROWSER_COMPATIBLE
ホスト名ベリファイアはありますか?
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
お役に立てれば。
実際、 AllowAllHostnameVerifier のjavadocは、ALLOW_ALL__HOSTNAME_VERIFIER
の直接の置換を提供します。これは NoopHostnameVerifier です。
BrowserCompatHostnameVerifier
は本質的にIE 5/6互換性のある実装でした。実際に最新のブラウザアプリケーションと互換性があるかどうかはわかりません。BrowserCompatHostnameVerifier
はに存在するべきではありませんでした。そもそも、もう使用すべきではありません。
私はこれをすべて読みましたが、何もうまくいきませんでした。これが私の一日を救ったものです: https://stackoverflow.com/a/36507502/3090309
私が使用していた:
compile group: 'org.Apache.httpcomponents', name: 'httpclient', version: '4.5.2'