Vista web android con certificado de cliente

He intentado por días para utilizar una vista web con un certificado de cliente incrustado en la aplicación, pero me parece que el sdk android no proporciona ninguna manera de hacerlo, hay una devolución de llamada para interceptar el desafío enviado por el servidor? Hay una manera de usar webview con un certificado de cliente y hacer https solicitud?

Ya que estoy interesado en su problema también, he comprobado la documentación de WebView y WebViewClient, navegó alrededor y de hecho parece que no se puede autenticar una sesión de webview utilizando un certificado de cliente, como el método necesario (ClientCertRequestHandler) no es un API pública.

Uso de una WebView 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 para Android 4.0 incluye soporte para la autenticación de certificados de cliente en el navegador.

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

No se hace mención de WebViews 🙁

Aunque hay alguna nueva 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 el WebView va a usarlos … Así que supongo que deberías probar la clase KeyChain y ver si puedes autenticar correctamente (no tengo una manera sencilla de probar esto, así que estás solo).

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

Solución 1:

Utilizar ClientCertRequestHandler de todos modos (Está marcado como oculto, pero aparentemente todavía utilizable):

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

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

Solución 2:

Si puedes limitar tu objetivo a Android 4.0 o más reciente, una solución en negrita (y poco probable …) es intentar cargar el certificado en la vista web desde tu almacenamiento local mediante un esquema de archivos:

Cargar archivo HTML local en WebView

Pero dudo mucho que la webview se comportará como el navegador hace …

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

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

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

Tienes mi simpatía.

Si solo necesitas ignorar las solicitudes de certificados SSL en 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 visiones web en entornos qa / dev / stage.

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

El WebView basado en Chronium 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á inmediatamente, pero no se mostrará ninguna página.

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

Para manejar correctamente la validación del certificado SSL para evitar que la aplicación se rechace desde la reproducción de Google de acuerdo con la Política de seguridad actualizada, cambie el código para invocar SslErrorHandler.proceed () siempre que el certificado presentado por el servidor cumpla con sus expectativas e invoque SslErrorHandler.cancel ().

Por ejemplo, agrego un cuadro de diálogo de alerta para que el usuario haya confirmado y parece que Google ya no muestra 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 que esto cambie no mostrará advertencia.

No podemos acceder al certificado de cliente en webview, hay un problema de google planteado para el mismo. https://code.google.com/p/android/issues/detail?id=53491

  • Android adjustResize - Cómo deshabilitar el efecto de fundido
  • WebView provoca el reinicio de la aplicación - Señal fatal 11 (SIGSEGV)
  • Establecer credenciales en una vista Web de Android mediante una conexión HTTPS segura
  • Horizontal inflable de menú en el clic largo para la vista web
  • error to startActivity (intención), ¿qué va mal?
  • Windows Phone 7 equivalente de Android WebView
  • WebView con un 30% de fondo en WebViewCoreThread
  • ¿Por qué WebView es mucho más rápido que un TextView?
  • Cómo ajustar la página web al ancho de la webview cuando se cambia el tamaño de la vista web (sin recargar)
  • Aceleración de hardware WebView de Android
  • Android <4.3 WebView https error: Retroceder a SSLv3 porque host es TLS intolerante
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.