Android安全警报对话框

时间:2011-04-19 10:56:19

标签: android https ssl-certificate

当与断开的服务器建立HTTPS连接时,您可能会遇到麻烦,因为Android的默认行为是首先抛出 SSLException

所以,我想知道是否有一个标准的安全提示对话框,要求用户对无效证书采取行动,例如WebView所具有的(使用“继续”,“查看证书”和“取消”选项)?

例如,BlackBerry会自动显示此类对话框,并在出现错误之前代表用户等待操作。我可以在Android中做同样的事情吗?

2 个答案:

答案 0 :(得分:0)

我认为没有这样的东西 - 浏览器使用自定义对话框,不要将它暴露给第三方应用程序。至少我找不到任何想要的行为。顺便说一句,iOS的行为与Android完全相同。

答案 1 :(得分: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回调中你问平台它是否信任证书。如果没有,那么对信任管理器的调用将抛出异常。然后,您可以提示用户他们想要做什么。

使用onReceivedSslError()可以在WebView中完成同样的操作,此时您可以显示一个等效警告,允许用户按照他们的意愿继续操作。