I would like to override the onReceivedSslError()
of a WebViewClient
. Here I want to check if the error.getCertificate()
certificate is signed from a self-signed CA and, only in this case, call the handler.proceed()
. In pseudo-code:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
SslCertificate serverCertificate = error.getCertificate();
if (/* signed from my self-signed CA */) {
handler.proceed();
}
else {
super.onReceivedSslError(view, handler, error);
}
}
The public key of my CA is saved in a BouncyCastle resource called rootca.bks
. How can I do?
I think this should work (
SSL_IDMISMATCH
means "Hostname mismatch").If "hasError()" is not working, try
error.getPrimaryError() == SSL_IDMISMATCH
Check Documentation of SslError for all error-types.
EDIT: I tested the function on my own self-cert server (its a Xampp), and I got Error #3. That means you have to check for
error.hasError(SslError.SSL_UNTRUSTED)
for a self-signed cert.based on documentation:
Have you tried using the method
getIssuedBy().getDName()
of class SslCertificate. This method returns a String representing "The entity that issued this certificate".Take a look here: http://developer.android.com/reference/android/net/http/SslCertificate.html#getIssuedBy()
Then you just need to know wich string is returned when it is self signed.
EDIT: I think that if it is selfsigned, that should return empty string, and if not, it would return the entity
Regards
I think you can try as the following:
If failed validation, logcat will have some information such as
java.security.SignatureException: Signature was not verified...
If success, here's a screenshot: