2010-09-02 8 views
9

Estoy creando una versión de prueba de una aplicación para un cliente. Parte de esta aplicación usa una WebView que llama a un sitio basado en SSL. A su vez, el cliente ha proporcionado un dominio de prueba donde el nombre del certificado no coincide con el FQDN. Por desgracia, no están en condiciones de proporcionar un certificado que coincida. :(Android WebView SSL 'Advertencia de seguridad'

Estoy trabajando sobre este problema en la aplicación ad hoc para iOS con una línea de código (una vez más, no para uso de producción, solo para fines de prueba). He buscado información similar en el sistema operativo Android, pero las soluciones que he visto aquí y en otros lugares son suficientes para hacer girar la cabeza a lo grande en comparación!

¿existe una forma sencilla de evitar esto? Incluso un usuario de cara al ajuste escondido en alguna parte?

pistas ¡apreciado!

Respuesta

6

Cree un WebViewClient y maneje el onReceivedSslError que se ve así:

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) 

Dentro de esta devolución de llamada puede simplemente llamar al handler.proceed() y la página continuará cargando. Si no maneja esta devolución de llamada y llama al método proceed(), el comportamiento predeterminado será que la página no se cargue.

+1

ADVERTENCIA: Esto es peligroso - que elimina toda la seguridad de SSL. Sé que Joe quiere incluirlo solo en su aplicación de prueba, lo cual es bueno, pero la comunidad de seguridad ha visto muchos casos en los que este tipo de código inadvertidamente llega a las versiones de producción, silenciosamente y sin querer comprometer su seguridad. Por lo tanto, si desactiva esta seguridad, TENGA MUCHO CUIDADO para asegurarse de que no se propague a sus versiones de lanzamiento. Gracias por escuchar este anuncio de servicio público. –

0

Respuesta actualizada según la nueva actualización de la política de seguridad de Google para el Manejador de errores de SSL, consulte a los Desarrolladores de Android Help Center article.

Para evitar el rechazo de la aplicación en Google Play por infringir nuestra política de Comportamiento malintencionado.

Para manejar adecuadamente la validación de certificados SSL, cambie su código para invocar SslErrorHandler.proceed() siempre que el certificado presentado por el servidor cumpla con sus expectativas e invoque a SslErrorHandler.cancel() de lo contrario.

Por ejemplo, agregué un cuadro de diálogo de alerta para que el usuario haya confirmado 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(); 

}