我在Android上使用HttpClient連接到https://someUrl.com/somePath。問題是該網站的證書是* .someUrl.com,而不是someUrl.com,所以我得到一個SSLException。是的,但是,除非我能修復它,否則我會被卡住。我有辦法讓HttpClient放鬆並接受證書嗎?Android HttpClient - 證書中的主機名不匹配<example.com>!= <*。example.com>
回答
這是我(編輯)解決方案:
class MyVerifier extends AbstractVerifier {
private final X509HostnameVerifier delegate;
public MyVerifier(final X509HostnameVerifier delegate) {
this.delegate = delegate;
}
@Override
public void verify(String host, String[] cns, String[] subjectAlts)
throws SSLException {
boolean ok = false;
try {
delegate.verify(host, cns, subjectAlts);
} catch (SSLException e) {
for (String cn : cns) {
if (cn.startsWith("*.")) {
try {
delegate.verify(host, new String[] {
cn.substring(2) }, subjectAlts);
ok = true;
} catch (Exception e1) { }
}
}
if(!ok) throw e;
}
}
}
public DefaultHttpClient getTolerantClient() {
DefaultHttpClient client = new DefaultHttpClient();
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
.getConnectionManager().getSchemeRegistry().getScheme("https")
.getSocketFactory();
final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
if(!(delegate instanceof MyVerifier)) {
sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
}
return client;
}
它,除非有一個通配符域不改變默認行爲的優勢,在那種情況下,重新驗證,就好像2部分域(例如someUrl.com)是證書的一部分,否則重新生成原始異常。這意味着真正無效的證書仍然會失敗。
如果它想要*.someUrl.com
,那麼看起來你可以給它www.someUrl.com/somePath
而不是someUrl.com/somePath
。
都能跟得上。 www.someUrl.com重定向到someUrl.com – noah 2010-06-28 20:06:18
那麼我認爲那沒用。你真的需要https嗎?我會這樣猜測,但那會讓生活變得更容易。 – 2010-06-28 20:16:26
當網站不做重定向時,這是一個很好的臨時解決方案! – 2012-04-17 13:12:32
Android上的BouncyCastle太舊,無法識別通配符證書。
您可以編寫自己的X509TrustManager來檢查通配符。
或者您可以完全禁用證書檢查,如果您可以接受風險。看到這個問題,
其實ZZ,如果OP是正確的關於網站的名稱和證書的結構,那麼錯誤信息是正確的:**。someUrl.com *應該匹配www.someUrl.com和anything.someUrl。 com,但*不* someUrl.com或this.that.someUrl.com。 – 2010-06-29 00:00:05
,如果你使用的WebView只需調用
webview.clearSslPreferences();
忽略SSL錯誤
- 1. Apache HttpClient 4.2.3 - SSLException:證書中的主機名不匹配
- 2. javax.net.ssl.SSLException:證書中的主機名與Android中不匹配
- 3. javax.net.ssl.SSLException:證書中的主機名不匹配:在android
- 4. Java SSLException:證書中的主機名不匹配。非常錯誤的證書?
- 5. 主機名與證書主體不匹配
- 6. VB6 MSXML2「證書中的主機名無效或不匹配。」
- 7. JBrowserDriver主機名稱與主體提供的證書主體不匹配
- 8. Java的異常SSLException:主機名的證書不匹配www.googleapis.com
- 9. 錯誤:主機名/ IP不匹配證書的altnames Node.js的
- 10. 錯誤:主機名/ IP不匹配證書的altnames:
- 11. 主機名稱與對等方提供的證書主題不匹配,但它完美匹配
- 12. SSL證書錯誤>主機名不匹配
- 13. 錯誤錯誤發生運行Grails的CLI:主機名的證書不匹配:<repo.grails.org> = <*.jfrog.io>或<*.jfrog.io>或<jfrog.io>
- 14. Java的主機名不證書
- 15. Rails3中ActionMailer的問題。 (SSL主機名與服務器證書不匹配)
- 16. std :: cout中'operator <<'不匹配
- 17. javax.net.ssl.SSLException:證書與任何主題替代名稱不匹配
- 18. 主機名/ IP不匹配證書的altnames [流星JS電子郵件]
- 19. JVM忽略證書名稱不匹配
- 20. 捕獲證書域名不匹配openssl
- 21. Rails 3 ActionMailer錯誤 - 主機名與服務器證書不匹配
- 22. 如何讓Ruby Net/Ldap忽略服務器證書主機名不匹配?
- 23. 創建證書時的IP地址作爲主機名(CN)? (HTTPS主機名錯誤:應該是<ipAddress>)
- 24. 禁用證書主機名驗證
- 25. 鉻顯示:HTTP主機名和TLS SNI主機名不匹配
- 26. 分佈證書不匹配
- 27. WSO2 DAS:證書不匹配
- 28. httpclient和自簽名證書的問題
- 29. 沒有主機名的SSL證書
- 30. 」SSL證書包含與主機名不匹配的通用名稱(CN)。「在VSTS中部署
我試過使用上面的方法,但有時會出現堆棧溢出異常 - verify()方法從不停止遞歸。在幾十萬次安裝中,它每週發生約80次。你有沒有看到這個問題? – user291701 2010-10-28 15:32:08
@ user291701我編輯了代碼以嘗試解決您的問題。我猜想問題是你最終再次在同一個工廠設置驗證程序,所以它最終會以某種方式委託給自己......如果找到更好的方法,請隨時編輯我的答案。 – noah 2010-11-02 13:41:52
在任何情況下,我面臨'服務器無法爲請求提供服務,因爲媒體類型不受支持''錯誤。沒有得到任何關於這個原因的線索。 – 2016-04-05 13:07:11