Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WebView在空白屏幕中加载https url结果_Android_Ssl_Webview - Fatal编程技术网

Android WebView在空白屏幕中加载https url结果

Android WebView在空白屏幕中加载https url结果,android,ssl,webview,Android,Ssl,Webview,WebView可以很好地处理http请求和https,而众所周知的可信站点如 但我试图用第三方颁发的CA访问私人网站,这是一个空白屏幕。证书通过SD卡安装到手机上,并列在可信证书列表下 在将证书添加到TrustManager后,我使用HttpsURLConnection尝试相同的URL时,它工作正常(能够获取内容) 以下是WebView和HttpsURLConnection的代码片段 HttpsURLConnection:下面的代码运行良好,能够从URL获取内容(我无法共享URL,因为它无法从外

WebView可以很好地处理http请求和https,而众所周知的可信站点如 但我试图用第三方颁发的CA访问私人网站,这是一个空白屏幕。证书通过SD卡安装到手机上,并列在可信证书列表下

在将证书添加到TrustManager后,我使用HttpsURLConnection尝试相同的URL时,它工作正常(能够获取内容)

以下是WebView和HttpsURLConnection的代码片段

HttpsURLConnection:下面的代码运行良好,能够从URL获取内容(我无法共享URL,因为它无法从外部世界访问)

try
{
    SSLContext context = null;

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = getResources().openRawResource(R.raw.mi_net);
    Certificate ca;
    try {
        ca = cf.generateCertificate(caInput);
    } finally {
        caInput.close();
    }

    // Create a KeyStore containing our trusted CAs
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    // Create a TrustManager that trusts the CAs in our KeyStore
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    // Create an SSLContext that uses our TrustManager
    context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);

    url = new URL(urlStr);
    HttpsURLConnection con = (HttpsURLConnection) url.openConnection();  
    con.setSSLSocketFactory(context.getSocketFactory());
    con.setInstanceFollowRedirects(true);

    con.setDoOutput(false);
    con.setConnectTimeout(1000);
    String responseMsg = con.getResponseMessage();
    response = con.getResponseCode();
    is = con.getInputStream();
}
WebView:不工作,在ReceivedSlerror上调用回调

{
    WebSettings viewSettings = webView.getSettings();
    viewSettings.setJavaScriptEnabled(true);
    viewSettings.setAllowContentAccess(true);
    viewSettings.setBuiltInZoomControls(false);
    webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.loadUrl(sameURL);

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(final WebView view, final String url, Bitmap favicon) {
            Log.d("ann", "onPageStarted");

        }

        @Override
        public void onPageFinished(final WebView view, String url) {
            Log.d("ann", "inside onPageFinished");
        }

        @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String failingUrl) {

            if (!failingUrl.startsWith("mailto:")) {
                webView.loadUrl("file:///android_asset/html/error.html");
            }

        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                                       SslError error) {
            super.onReceivedSslError(view, handler, error);
            Log.d("ann","SSL error");

            handler.proceed();
        }

    });}
}

请帮我提个建议。WebViewClient异常为I/X509Util﹕ 验证证书链失败,错误:java.security.cert.CertPathValidator异常:找不到证书路径的信任锚点。

对于HttpsUrlConnection,您正在从文件创建证书并在运行时进行设置

Webview必须使用系统中已经存在的任何内容

下面是一个类似的问题,提出了一个解决方法:


对于HttpsUrlConnection,您正在从文件创建证书,并在运行时进行设置

Webview必须使用系统中已经存在的任何内容

下面是一个类似的问题,提出了一个解决方法:


@重写公共void onReceivedSlerror(WebView视图,SslErrorHandler,SslError错误){//super.onReceivedSlerror(视图,处理程序,错误);Log.d(“ann”,“SSL错误”);handler.procedure();}在对超级函数进行注释后,我开始对其进行操作。请注意,此解决方案允许您绕过证书检查,您应该处理逻辑,以便对作为文件包含的证书执行此检查。否则就如同不使用https。@重写public void onReceivedSlerror(WebView视图,SslError处理程序,SslError错误){//super.onReceivedSlerror(视图,处理程序,错误);Log.d(“ann”,“SSL错误”);handler.continue();}在对超级函数进行注释后,我开始对其进行操作。请注意,此解决方案允许您绕过证书检查,您应该处理逻辑,以便对作为文件包含的证书执行此检查。否则就像不使用https一样。