带有证书的Android Webview

时间:2018-12-04 06:07:48

标签: android android-webview sslerrorhandler

我必须在公司网络内部可用的应用程序中加载公司网站,webview会引发onReceivedSslError,相信证书似乎会重定向到登录屏幕,而不是加载页面。不会调用onReceivedClientCertRequest或其他任何选项来加载Web视图吗?

我到目前为止所做的示例代码

webView.webViewClient = IntranetWebViewClient()
webView.settings.javaScriptEnabled = true
webView.loadUrl(url)

private inner class CustomWebViewClient : WebViewClient() {

        override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
            val bundle = SslCertificate.saveState(error.getCertificate());
            var x509Certificate: X509Certificate? = null
            val bytes = bundle.getByteArray("x509-certificate");
            if (bytes == null) {

            } else {
                val certFactory = CertificateFactory.getInstance("X.509");
                val cert = certFactory.generateCertificate(ByteArrayInputStream(bytes));
                x509Certificate = cert as X509Certificate
            }
            val x509Certificates: Array<X509Certificate> = arrayOf(x509Certificate!!)

             val trustManager = customTrustManagerFactory
              trustManager.checkServerTrusted(x509Certificates, "generic")

            handler.proceed() 
        }

        override fun onReceivedClientCertRequest(view: WebView?, request: ClientCertRequest?) {
            val keyStore = KeyStore.getInstance(SecurityConstants.KEY_STORE_TYPE_PKCS12)
            keyStore.load(context!!.assets.open(“certificate-name”), password.toCharArray())
            val alias = keyStore.aliases().nextElement()
            keyStore.getKey(alias, password.toCharArray())

            request?.proceed(keyStore.getKey(keyStore.aliases().nextElement(), password.toCharArray()) as PrivateKey,
                    arrayOf(keyStore.getCertificate(alias) as X509Certificate))
        }

        override fun onReceivedError(view: WebView, errorCod: Int, description: String, failingUrl: String) {
            isPageError = true
        }
        override fun onPageFinished(view: WebView, url: String) {
            super.onPageFinished(webView, url)
        }
}

0 个答案:

没有答案