При подключении к защищенному серверу SSL, где хранится сертификат SSL на устройстве Android, когда мы используем класс Android WebViewClient
?
Судя по моему тестированию, это отличается от хранилища сертификатов устройства, которое /system/etc/security/cacerts.bks
Этот вывод сделан из следующих шагов, которые я выполнил:
Соединитесь, используя класс, который расширяет WebViewClient, перебирая метод ниже
public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
// method to show an alert box. on User accept, call handler.proceed()
}
Поле предупреждения отображается только один раз при первом подключении к серверу.После этого, если мы подключимся снова, то это не показывается.Это говорит о том, что сертификат хранится внутри пользовательского агента.
После (2), если мы используем Android URLConnection для подключения к серверу, настройку доверенного менеджера таким образом, что сертификат не является довереннымвыдаст исключение.
Код для (3):
a)
context.init(managers, new TrustManager[] {
new MyX509TrustManager(null) }, new SecureRandom());
//using null for keystore, android will set trustStore to point to cacerts.bks file
b) Внутри MyX509TrustManager:
public void checkServerTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
if ((certificates != null) && (certificates.length == 1)) {
try {
standardTrustManager.checkServerTrusted(certificates, authType);
} catch (CertificateException certException) {
certException.printStackTrace();
}
}
}
Обнаружено, что во время (3) мы получаем исключение:
java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found
Теперь, если пользовательский агент принял сертификат и сохранил его внутри, не должен ли он использоваться Android URLConnectionпри подключении к серверу.Если нет, то сертификат хранится не в хранилище сертификатов устройства, а локально в хранилище приложений (пользовательский агент).