android ssl webview client certificate

webview de android con certificado de cliente



ssl certificate (7)

Intenté durante días usar una vista web con un certificado de cliente integrado en la aplicación, pero me parece que el SDK de Android no proporciona ninguna forma de hacerlo. ¿Hay una devolución de llamada para interceptar el desafío enviado por el servidor? ¿Hay alguna forma de usar webview con un certificado de cliente y hacer una solicitud https?


Como también estoy interesado en su problema, verifiqué la documentación de WebView y WebViewClient, navegué por todas partes y parece que no puede autenticar una sesión de webview usando un certificado de cliente, ya que el método requerido (ClientCertRequestHandler) no es un API pública.

Uso de una vista web de Android para conectarse a un servidor seguro con un certificado de cliente

Una búsqueda en las discusiones de seguridad de Android confirma que la llamada no está disponible:

https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J

y aunque

La versión de Android 4.0 incluye soporte para la autenticación de certificado de cliente en el navegador.

(ref: https://code.google.com/p/android/issues/detail?id=8196 )

No se hace ninguna mención sobre WebViews :(

Aunque hay algunas nuevas API para cargar certificados en un llavero:

http://developer.android.com/reference/android/security/KeyChain.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html

no está claro si WebView los va a usar ... Entonces, supongo que debería probar la clase KeyChain y ver si puede autenticarse correctamente (no tengo una forma simple de probar esto, por lo que está solo).

Si KeyChain no funciona con WebViews , creo que todo se reduce a un par de soluciones perfectas:

Solución 1:

use ClientCertRequestHandler de todos modos (está marcado como oculto, pero aparentemente aún se puede usar):

https://code.google.com/p/android/issues/detail?id=53491

Sin embargo, incluso suponiendo que lo hagas, el Android Dev. El equipo puede modificar / eliminar el método sin previo aviso y su aplicación puede dejar de funcionar en futuras versiones del SO.

Solución 2:

Si puede limitar su objetivo a Android 4.0 o más reciente, una solución audaz (y poco probable ...) es tratar de cargar el certificado en la vista web desde su almacenamiento local usando un esquema de archivo:

Cargar archivo HTML local en WebView

pero dudo mucho que la vista web se comporte como lo hace el navegador ...

Solución 3: (que debería funcionar pero requiere mucho esfuerzo)

Maneje cada conexión https en segundo plano usando HTTPClient o HttpURLConnection y luego pase los datos a WebView:

http://chariotsolutions.com/blog/post/https-with-client-certificates-on/

Tienes mi simpatía.


El Chronium basado en WebView en Android 4.4 introdujo un error: cuando el servidor solicita un certificado de cliente, el WebView detiene el proceso de carga. El método onPageFinished se llamará de inmediato, pero no se mostrará ninguna página.

-> https://code.google.com/p/android/issues/detail?id=62533


El certificado SSL autofirmado está funcionando para mí

Compruebe esta respuesta https://.com/a/49003522/5058630


En API 21 (Android Lollipop) y superior, puede anular el WebViewClient.onReceivedClientCertRequest (vista de WebView, solicitud de ClientCertRequest) . En el método, use su administrador de claves para obtener la clave privada y la cadena de certificados y llame a request.proceed () .



Para manejar adecuadamente la validación del certificado SSL para evitar que la aplicación sea rechazada por Google Play de acuerdo con la Política de Seguridad actualizada, cambie su código para invocar SslErrorHandler.proceed () siempre que el certificado presentado por el servidor cumpla con sus expectativas, e invoque SslErrorHandler.cancel () de lo contrario.

Por ejemplo, agrego un cuadro de diálogo de alerta para que el usuario lo confirme y parece que Google ya no muestra ninguna advertencia.

@Override public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); String message = "SSL Certificate error."; switch (error.getPrimaryError()) { case SslError.SSL_UNTRUSTED: message = "The certificate authority is not trusted."; break; case SslError.SSL_EXPIRED: message = "The certificate has expired."; break; case SslError.SSL_IDMISMATCH: message = "The certificate Hostname mismatch."; break; case SslError.SSL_NOTYETVALID: message = "The certificate is not yet valid."; break; } message += " Do you want to continue anyway?"; builder.setTitle("SSL Certificate Error"); builder.setMessage(message); builder.setPositiveButton("continue", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.proceed(); } }); builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.cancel(); } }); final AlertDialog dialog = builder.create(); dialog.show(); }

Después de esto los cambios no se mostrará advertencia.


Si solo necesita ignorar las solicitudes de certificado ssl dentro de la vista web, esto funcionó para mí en Lollipop:

Dentro de su cliente de vista web, sobrescriba:

@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // Ignore SSL certificate errors }

Esto es útil para depurar vistas web en entornos qa / dev / stage.