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.
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 () .
No podemos acceder al certificado del cliente en webview. Se ha planteado un problema de Google para el mismo. https://code.google.com/p/android/issues/detail?id=53491
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.