2010-06-28 126 views

回答

33

這是我(編輯)解決方案:

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)是證書的一部分,否則重新生成原始異常。這意味着真正無效的證書仍然會失敗。

+0

我試過使用上面的方法,但有時會出現堆棧溢出異常 - verify()方法從不停止遞歸。在幾十萬次安裝中,它每週發生約80次。你有沒有看到這個問題? – user291701 2010-10-28 15:32:08

+0

@ user291701我編輯了代碼以嘗試解決您的問題。我猜想問題是你最終再次在同一個工廠設置驗證程序,所以它最終會以某種方式委託給自己......如果找到更好的方法,請隨時編輯我的答案。 – noah 2010-11-02 13:41:52

+0

在任何情況下,我面臨'服務器無法爲請求提供服務,因爲媒體類型不受支持''錯誤。沒有得到任何關於這個原因的線索。 – 2016-04-05 13:07:11

1

如果它想要*.someUrl.com,那麼看起來你可以給它www.someUrl.com/somePath而不是someUrl.com/somePath

+1

都能跟得上。 www.someUrl.com重定向到someUrl.com – noah 2010-06-28 20:06:18

+0

那麼我認爲那沒用。你真的需要https嗎?我會這樣猜測,但那會讓生活變得更容易。 – 2010-06-28 20:16:26

+0

當網站不做重定向時,這是一個很好的臨時解決方案! – 2012-04-17 13:12:32

3

Android上的BouncyCastle太舊,無法識別通配符證書。

您可以編寫自己的X509TrustManager來檢查通配符。

或者您可以完全禁用證書檢查,如果您可以接受風險。看到這個問題,

Self-signed SSL acceptance on Android

+0

其實ZZ,如果OP是正確的關於網站的名稱和證書的結構,那麼錯誤信息是正確的:**。someUrl.com *應該匹配www.someUrl.com和anything.someUrl。 com,但*不* someUrl.com或this.that.someUrl.com。 – 2010-06-29 00:00:05

1

,如果你使用的WebView只需調用

webview.clearSslPreferences(); 

忽略SSL錯誤

相關問題