¿La vista web en Android es compatible con SSL?

El control WebView en android, ¿es compatible con SSL?

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

¿Alguna sugerencia?

No soy 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á usando froyo o mejor, 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(); } }); 

Para manejar correctamente la validación del certificado SSLoogle play según 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 () en caso 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 esto cambia, no mostrará una advertencia.

Google play rechazó mi aplicación y luego hice 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 los cambios anteriores, Google Play aceptó mi apk

Y para generar sus pls de administrador de confianza ssl verifique esta respuesta

Debe habilitar la configuración de vista web para ver el sitio web basado en SSL:

 webView.getSetting().setDomStorageEnable(true);