【问题标题】:Webview SSL Certification error untrustedWebview SSL 认证错误不受信任
【发布时间】:2018-08-21 10:43:38
【问题描述】:

我的 Android 应用程序出现问题。 当我试图在我的 webview 中加载一个 url 时,它给了我 ssl 错误不受信任的证书。

网址在手机和电脑上打开没有任何问题,但在我的网页视图上却不会。 url 有 oauth2 登录确认...

我已经尝试使用 onReceivedSslError 并给它handler.proceed() 并且它可以工作..但是这是不安全的,因为它绕过了所有 ssl 安全性,并且 google play 商店不允许您使用这行代码发布您的应用程序。

请大家帮忙!!谢谢

【问题讨论】:

标签: java android ssl webview


【解决方案1】:
  Certificate certificate;
  CertificateFactory cf = null;
    try {
        cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = getResources().openRawResource(R.raw.cert);
    certificate = cf.generateCertificate(caInput);
    caInput.close();

    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

添加 onReceivedSslError 如下。使用 url 使用的证书检查原始文件中的证书,以便您使用cert.verify 验证它

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

            SslCertificate sslCertificate = error.getCertificate();
            Certificate cert = getX509Certificate(sslCertificate);
            if (cert != null && certificate != null){
                try {
                    cert.verify(certificate.getPublicKey());
                    handler.proceed();
                } catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException | SignatureException e) {
                    super.onReceivedSslError(view, handler, error);
                    handler.cancel();
                    e.printStackTrace();
                }
            } else {
                super.onReceivedSslError(view, handler, error);
            }
            super.onReceivedSslError(view, handler, error);
        }

如下图添加生成证书的代码函数

private Certificate getX509Certificate(SslCertificate sslCertificate) {
    Bundle bundle = SslCertificate.saveState(sslCertificate);
    byte[] bytes = bundle.getByteArray("x509-certificate");
    if (bytes == null) {
        return null;
    } else {
        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            return certFactory.generateCertificate(new ByteArrayInputStream(bytes));
        } catch (CertificateException e) {
            return null;
        }
    }
}

要正确处理 SSL 证书验证,请更改代码以在服务器提供的证书符合您的期望时调用 SslErrorHandler.proceed(),否则调用 SslErrorHandler.cancel()。包含受影响应用和类的电子邮件警报已发送至您的开发者帐户地址。

如果您使用 onReceivedSslError 上传您的应用并使用 handler.proceed 而不检查证书,这就是谷歌安全警报将显示的内容。

希望对你有帮助!!

【讨论】:

    【解决方案2】:

    就我而言,SSL certificate chain 已损坏。您可以使用SSL Checker 快速测试此类问题,或者使用SSLLabs 快速测试此类问题。但请不要问我这是怎么发生的。

    重新安装 SSL 证书后,所有关于“WebView 中不受信任的 SSL 证书”的错误最终都消失了。我还删除了 onReceivedSslError(...) 的 @Override 并删除了 handler.proceed(),然后我的应用没有被 Google Play 商店拒绝(再次)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-14
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多