Android WebViewClient
вызывает onReceivedSslError
когда он встречает ненадежный сертификат. Тем не менее, объект SslError
я получаю в этом вызове, не имеет никакого способа публичного X509Certificate
к базовому X509Certificate
для проверки его против существующего TrustStoreManager
. Глядя на источнике, я могу получить доступ к X509Certificate
закодированных байт таким образом:
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
Bundle bundle = SslCertificate.saveState(error.getCertificate());
X509Certificate x509Certificate;
byte[] bytes = bundle.getByteArray("x509-certificate");
if (bytes == null) {
x509Certificate = null;
} else {
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
x509Certificate = (X509Certificate) cert;
} catch (CertificateException e) {
x509Certificate = null;
}
}
// Now I have an X509Certificate I can pass to an X509TrustManager for validation.
}
Очевидно, что это частный API и является хрупким, хотя я предполагаю, что он достаточно надежный, поскольку они не могут изменить формат пакета. Есть ли способ лучше?