Webview SSL认证错误不受信任

时间:2018-08-21 10:43:39

标签: android ssl webview android-webview android-security

我的Android应用程序遇到问题。当我尝试在Webview中加载网址时,它会给我ssl错误不受信任的证书。

在手机和PC上打开的URL都没有问题,但是在我的webview上却没有。网址具有oauth2登录限制...

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

请,需要帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

 Certificate certificate;

您应该检查sslerror

在res的原始文件中复制您的公钥

从原始文件中创建证书,如下所示:

  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而未检查证书,则这将是Google安全警报显示的内容。

希望有帮助!