2011-04-19 90 views
0

當進行到一個破碎的服務器,你可以遇到麻煩由於Android的默認行爲是拋出異常SSLException在首位HTTPS連接。Android安全警告對話框

所以,我想知道是否有一個標準的安全提示對話框,要求用戶對一個WebView具有的無效證書採取行動(使用'繼續','查看證書'和'取消'選項)?

例如黑莓自動示出了這樣的對話框,並等待提高錯誤之前代表用戶的動作。我可以在Android中做同樣的事嗎?

回答

0

我想有沒有這樣的事情 - 瀏覽器使用自定義對話框,不要將其暴露在第三方應用程序。至少我找不到任何提及的理想行爲。順便說一句,iOS的行爲完全像Android。

0

沒有標準對話框,這樣,事實上的HttpClient的默認行爲將是僅接受證書是Android的受信任的證書存儲區的一部分。

您可以通過建立自己的信任管理器,你再與你的HttpClient的實例相關聯的做到這一點。這看起來是這樣的:

public class PromptUserTrustManager implements X509TrustManager 
{ 
    private AcceptUserSelectedCertsTrustManager(ValidateCertificateCallback callback) throws NoSuchAlgorithmException, KeyStoreException 
    { 
     KeyStore keyStore = null; 
     TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     factory.init(keyStore); 
     TrustManager [] trustmanagers = factory.getTrustManagers(); 
     m_standardTrustManager = (X509TrustManager) trustmanagers[0]; 
    } 

    @Override 
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException 
    { 
    } 

    // This is where you check the server cert and make the determination 
    @Override 
    public void checkServerTrusted(X509Certificate[] certChain, String authType)throws CertificateException 
    { 
     try 
     { 
      m_standardTrustManager.checkServerTrusted(certChain,authType); 
     } 
     catch(CertificateException e) 
     { 
      // Cert isn't trusted - popup the error here. You'll need to 
      // make sure you switch to the UI thread since here you're on a network thread 
      if(!userAcceptsCert(certChain)) 
      { 
       throw e; 
      } 
     } 
    } 
} 

所以基本上你所做的是在checkServerTrusted回調中,你問平臺是否信任證書。如果不是,那麼對信任管理器的調用會拋出異常。然後你可以提示用戶他們想要做什麼。

同樣的事情可以使用web視圖onReceivedSslError()此時您可以顯示一個等效的警告允許用戶如果他們希望繼續進行。