2011-05-12 22 views
27

El control WebView en android, ¿es compatible con SSL?¿La Vista web en Android es compatible con SSL?

Estoy intentando cargar una página web que utiliza un certificado SSL de confianza pero el WebView es simplemente blanco.

¿Alguna sugerencia?

+0

¿Se puede abrir la página web con la compilación en la aplicación de Internet? – Mannaz

Respuesta

71

No es un experto, solo lo que pude encontrar en la web. por lo que entiendo, WebView sí admite SSL, sin embargo, la pantalla en blanco indica que WebView no cree que el certificado sea válido. Esto puede suceder con un certificado autofirmado o desde una autenticación de raíz que no está configurada en android (cert perfectamente válido no valida). En cualquier caso, si está utilizando Froyo o mejor se puede intentar algo como:

import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.webkit.SslErrorHandler; 
import android.net.http.SslError; 

... 

engine = (WebView) findViewById(R.id.my_webview); 
engine.setWebViewClient(new WebViewClient() { 

    @Override 
    public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { 
     handler.proceed(); 
    } 
}); 
+1

Lo extraño es que no se trata de un certificado autofirmado ... –

+0

hmmm, bueno, mirando más lejos Encuentro que WebView sí lo hace. Tiene los métodos 'getCertificate()', 'clearSslPreferences()' y 'setCertificate (SslCertificate certificate)' para esto. El problema, según lo veo, es que Webkit nos diga cuál es el problema. al verificar, puede buscar en [esto] (http://developer.android.com/reference/android/webkit/SslErrorHandler.html) que es un error de manejo de SSL. – chris

+0

@chris Dices que esto funciona en froyo o mejor, que estoy usando, pero tanto SslErrorHandler como SslError 'no se pueden resolver a un tipo, y no puedo importar nada ... ¿alguna sugerencia? – RyanG

0

Tienes que activar la configuración para ver sitio web basado en SSL vistas web:

webView.getSetting().setDomStorageEnable(true); 
5

para manejar adecuadamente SSL juego validationoogle certificado de acuerdo con la Política de seguridad actualizada, cambie su código para invocar a 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(view.getContext()); 
    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 estos cambios, no se mostrará ninguna advertencia.

+0

Muchas gracias, funcionó como un encanto. +1 –

1

Google juego rechazó mi aplicación y luego me hizo esto ...

@Override 
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { 

     try { 

      //Get the X509 trust manager from your ssl certificate 
      X509TrustManager trustManager = mySslCertificate.getX509TrustManager(); 

      //Get the certificate from error object 
      Bundle bundle = SslCertificate.saveState(error.getCertificate()); 
      X509Certificate x509Certificate; 
      byte[] bytes = bundle.getByteArray("x509-certificate"); 
      if (bytes == null) { 
       x509Certificate = null; 
      } else { 
       CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
       Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); 
       x509Certificate = (X509Certificate) cert; 
      } 
      X509Certificate[] x509Certificates = new X509Certificate[1]; 
      x509Certificates[0] = x509Certificate; 

      // check weather the certificate is trusted 
      trustManager.checkServerTrusted(x509Certificates, "ECDH_RSA"); 

      Log.e(TAG, "Certificate from " + error.getUrl() + " is trusted."); 
      handler.proceed(); 
     } catch (Exception e) { 
      Log.e(TAG, "Failed to access " + error.getUrl() + ". Error: " + error.getPrimaryError()); 
      final AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.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 hacer lo anterior cambia el juego Google aceptó mi apk

Y para generar su gestor de confianza SSL pls comprueban este answer

+0

Muchas gracias :) Estaba tan cerca de la solución y me ayudaste a terminarla :) – Viktor

+0

@Viktor Bienvenido amigo :) –

Cuestiones relacionadas