2011-05-12 46 views

回答

71

不是专家,只是我可以在网上找到。 据我所知,WebView确实支持ssl,但是,空白屏幕表明WebView不相信证书是有效的。这可能会发生在自签名证书或未在android中设置的根认证(完全有效的证书未验证)。在任何情况下,如果您使用的是升级Froyo或更好的,你可以尝试这样的:

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

奇怪的是,这不是一个自我签署的证书.. – 2011-05-12 13:12:52

+0

嗯,好吧,看起来更进一步我发现WebView确实支持SSL。它具有'getCertificate()','clearSslPreferences()'和'setCertificate(SslCertificate证书)'方法。正如我所看到的那样,问题是让webkit告诉我们问题是什么。在检查时,你可能会看到[this](http://developer.android.com/reference/android/webkit/SslErrorHandler.html),这是ssl错误处理。 – chris 2011-05-12 13:48:38

+0

@chris你说这适用于froyo或更好,我正在使用,但SslErrorHandler和SslError'都不能解析为类型,我不能导入任何...任何建议? – RyanG 2011-09-09 15:51:23

0

您必须启用的WebView设置来查看基于SSL的网站:

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

要正确处理SSL证书validationoogle戏根据更新的安全策略,当服务器提供的证书满足您的期望时,更改您的代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel()。

例如,我添加了一个警告对话框,让用户确认并且似乎Google不再显示警告。

@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(); 
} 

在此更改后,它不会显示警告。

+0

非常感谢你们,它像一个魅力。 +1 – 2018-01-23 09:34:11

1

谷歌拒绝打我的应用程序,然后我做了这...

@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(); 
     } 
    } 

作出上述改变谷歌Play上我的APK后

,并生成您的SSL信任管理器请选中该answer

+0

非常感谢你:)我是如此接近解决方案,你帮我完成它:) – Viktor 2018-02-27 14:16:07

+0

@Viktor欢迎队友:) – 2018-02-28 07:51:43