【问题标题】:I get an CertPathValidatorException issue in webview我在 webview 中遇到 CertPathValidatorException 问题
【发布时间】:2016-10-12 11:32:36
【问题描述】:

这是我的网页视图:

  if(bundle != null){
        String file = bundle.getString("url");
        Log.i("","url is:" + file);
        wv.setWebViewClient(new MyWebViewClient());
        wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        WebSettings settings = wv.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        settings.setAppCacheEnabled(false);
        settings.setDomStorageEnabled(true);
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                loadingPanel.setVisibility(View.GONE);
            }
        });
        wv.loadUrl(file);
    }

这是我的 WebViewClient:

  private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        wv.loadUrl(url);
        return true;
    }

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler,
                                   SslError error) {
        super.onReceivedSslError(view, handler, error);
        Log.e("","error is certificate:" + error.getCertificate());
        Log.e("","error is:" + error.getPrimaryError());
        Log.e("","error is url:" + error.getUrl());
        handler.proceed();
    }
}

我得到了这个错误:

10-12 13:27:43.174: I/X509Util(14748): Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

此外,“未达到 onReceivedSSLError 方法。我没有得到我在该函数中添加的日志”。我做错了什么?

这也是我拥有的权限,不知道是否需要更多权限:

android.permission.INTERNET"
android.permission.READ_EXTERNAL_STORAGE"

我什至尝试将证书添加到 webview,如下所示:

 try {
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            Certificate cer = keyStore.getCertificate("ca");
            if(cer != null) {
                Log.i("", "certificate is:" + cer);
                Log.i("", "certificate is:" + cer.toString());
                Log.i("", "certificate is:" + cer.getType());
                Log.i("", "certificate is:" + cer.getPublicKey());
                X509Certificate x509 = (X509Certificate) cer;
                SslCertificate sslCert = new SslCertificate(x509);
                wv.setCertificate(sslCert);
            }
        }catch (Exception e){
            Log.e("","error trying to get it:" + e.getMessage());
        }

但没有运气。

【问题讨论】:

    标签: android ssl webview ssl-certificate self-signed


    【解决方案1】:

    MyWebViewClient() 类包含 SSL 错误处理程序。您在代码 sn-p 的第 4 行中正确设置它:

     wv.setWebViewClient(new MyWebViewClient());
    

    但是,在第 12 行中,您再次调用 wv.setWebViewClient(...),它替换了之前设置的 WebViewClient。因此代码永远不会被调用...

    【讨论】:

    • 谢谢,错过了。将其清理并再次检查
    • 我仍然知道:“10-12 17:21:40.168: I/X509Util(14061): 无法验证证书链,错误:java.security.cert.CertPathValidatorException: Trust anchor for找不到证书路径。”错误。它输入该代码,我得到我的日志。并调用 handler.proceed。但它不加载任何东西。我在 onReceivedSSLError 中尝试了 vw.setCertificate(error.getCertificate()) ,但我得到了同样的结果。如果我这样做 wv.getCertificate 它说它是空的(它不会保存它)。如何将证书添加到 Webview?
    • 尝试删除您的onReceivedSslError 中的超级呼叫。它执行handler.cancel()
    • 删除 onReceivedSslErro 也起到了作用!谢谢!
    • 它不再工作了......我认为它可以,但几个小时后谷歌拒绝了我的应用程序:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2020-11-16
    • 2020-01-29
    • 2022-01-24
    相关资源
    最近更新 更多