Android WebView loadUrl()中的信任证书颁发机构

Android WebView loadUrl()中的信任证书颁发机构,android,android-webview,ssl-certificate,x509certificate,ca,Android,Android Webview,Ssl Certificate,X509certificate,Ca,根据安全扫描程序的结果,我需要限制应用程序信任的证书颁发机构 扫描结果指出webView.loadUrl(“https://example.com/page");。我看到了如何创建一个使用TrustManager的SslSocketFactory,但在WebView中没有看到允许我设置它的API 实现这一点的可能方法有哪些?我认为WebViewClient的onReceivedSslError方法将是一个很好的切入点 首先,按照中完全相同的片段编写TrustManager TrustM

根据安全扫描程序的结果,我需要限制应用程序信任的证书颁发机构

扫描结果指出
webView.loadUrl(“https://example.com/page");。我看到了如何创建一个使用TrustManager的SslSocketFactory,但在WebView中没有看到允许我设置它的API


实现这一点的可能方法有哪些?

我认为
WebViewClient
onReceivedSslError
方法将是一个很好的切入点

首先,按照中完全相同的片段编写TrustManager

    TrustManagerFactory tmf = null;

    private void initTrustStore() throws
            java.security.cert.CertificateException, FileNotFoundException,
            IOException, KeyStoreException, NoSuchAlgorithmException {

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

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        InputStream caInput = new BufferedInputStream(
                    getResources().getAssets().open("ca.crt"));
            Certificate ca;
            try {
                ca = cf.generateCertificate(caInput);
                Log.d(TAG, "ca-root DN=" + ((X509Certificate) ca).getSubjectDN());
            }
            finally {
                caInput.close();
            }
            trustedKeyStore.setCertificateEntry("ca", ca);

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

    }
然后,扩展自定义WebViewClient类,从

最后,将
CheckServerTrustedWebViewClient
设置为
WebView

webView.setWebViewClient(new CheckServerTrustedWebViewClient());

然而,有一个问题。准备好的CA证书与服务器证书完全相同(中间CA不是根CA)。仅提供根CA证书将不起作用。TrustManager不是可以在运行时下载服务器证书链吗?有什么建议吗?

我会避免使用任何“安全扫描程序”,因为它没有提供如何解决报告的问题的详细信息。@Commonware报告中的“建议”部分在上面的链接中有完全相同的代码片段,只建议使用证书固定或自定义密钥库。除此之外,没有其他信息。AFAIK,使用
WebView
,这两种信息都是不可能的。
webView.setWebViewClient(new CheckServerTrustedWebViewClient());