当与断开的服务器建立HTTPS连接时,您可能会遇到麻烦,因为Android的默认行为是首先抛出 SSLException 。
所以,我想知道是否有一个标准的安全提示对话框,要求用户对无效证书采取行动,例如WebView所具有的(使用“继续”,“查看证书”和“取消”选项)?
例如,BlackBerry会自动显示此类对话框,并在出现错误之前代表用户等待操作。我可以在Android中做同样的事情吗?
答案 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中完成同样的操作,此时您可以显示一个等效警告,允许用户按照他们的意愿继续操作。