[英]apache httpclient 4.4: HostnameVerifier transition from 4.3.x
HttpClient 4.3在org.apache.http.conn.ssl.SSLConnectionSocketFactory
有三個靜態變量:
將依賴項升級到HttpClient的4.4版時,我看到所有上述常量都已棄用。 JavaDoc中的棄用說明提到使用org.apache.http.conn.ssl.DefaultHostnameVerifier
。 閱讀文檔,我假設DefaultHostnameVerifier
是STRICT_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_VERIFIER
和BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
(來自JavaDoc)之間有一個微妙的區別:
BROWSER_COMPATIBLE和STRICT之間的唯一區別是帶有BROWSER_COMPATIBLE的通配符(例如“* .foo.com”)匹配所有子域,包括“abfoo.com”。
我們是否為httpclient 4.4提供了一個隨時可用的BROWSER_COMPATIBLE
主機名驗證程序?
實際上, AllowAllHostnameVerifier的javadoc直接替換了ALLOW_ALL__HOSTNAME_VERIFIER
,即NoopHostnameVerifier 。
您不需要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.