webview 手动验证ssl

一、获取证书

在显示有安全标志的网页上,点击安全哪里,然后点击证书,如图所示:

或者按F12,如图所示:

最终都会到底下图所示页面:

然后按步骤一步一步进行:

但是选择证书的格式也是有区别的,此处使用的是base64的格式,如下图所示:

二、获取证书信息

下载好证书后,则打开证书,复制里面所有的信息,到https://www.myssl.cn/tools/downloadchain.html这个网址,进行证书分析:

如图所示:

至此,我们获取到了我们想要的证书信息:此处使用的是指纹sha256的java数组。

三、证书验证

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            //webView默认是不处理https请求的,页面显示空白,需要进行如下设置:
//            handler.proceed(); //继续使用SSL证书。
//             handler.cancel();    // 取消此请求以及出现错误的WebView的所有待处理请求。
            // handler.handleMessage(null);    //可做其他处理
            if (error.getPrimaryError() == SslError.SSL_DATE_INVALID  // 日期不正确
                    || error.getPrimaryError() == SslError.SSL_EXPIRED // 日期不正确
                    || error.getPrimaryError() == SslError.SSL_INVALID // webview BUG
                    || error.getPrimaryError() == SslError.SSL_UNTRUSTED) { // 根证书丢失
                if (chkMySSLCNCert(error.getCertificate())) {
                    handler.proceed();  // 如果证书一致,忽略错误
                }
            }
        }

        private boolean chkMySSLCNCert(SslCertificate cert) {
        
            byte[] CrtSha256 = {-70, -83, -39, 63, -107, -10, 88, -99, -29, 84, -118, 124, -93, 41, 2, -53, -72, 49, -124, -94, -30, -36, 123, 74, 5, 116, 56, -127, 72, -43, -68, 59 };  //证书指纹
            Bundle bundle = SslCertificate.saveState(cert);
            byte[] bytes = bundle.getByteArray("x509-certificate");
            if (bytes != null) {
                try {
                    CertificateFactory cf = CertificateFactory.getInstance("X.509");
                    Certificate ca = cf.generateCertificate(new ByteArrayInputStream(bytes));
                    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
                    byte[] Key = sha256.digest(((X509Certificate) ca).getEncoded());
                    return Arrays.equals(Key, CrtSha256);
                } catch (Exception Ex) {
                }
            }
            return false;
        }

webview的onReceivedSslError()方法

SslErrorHandler方法:

缺陷:此方法虽然是可以验证证书,但是在证书过期后更新证书信息之后,相对的指纹sha256的信息也会改变,所以对app还是有影响。

 

参考文章:https://www.myssl.cn/ssl/android/app/check.htm

证书分析地址:https://www.myssl.cn/tools/downloadchain.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android提供了WebView控件来加载和显示Web页面。在使用WebView加载HTTPS网页时,SSL(即Secure Sockets Layer)是必需的。 SSL是一种用于在Internet上保护数据传输安全的加密协议。它确保在浏览器和服务器之间传输的数据是加密的,以防止第三方篡改或窃听数据。 要在Android WebView中使用SSL,需要采取以下步骤: 1. 配置WebView设置:在代中,我们可以通过设置WebView的WebSettings对象来启用JavaScript和SSL,以便加载HTTPS网页。可以使用以下代进行设置: ``` WebView webView = findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); ``` 2. 导入SSL证书:有时候,我们需要导入服务器的SSL证书,以便WebView可以信任该服务器。可以使用以下代导入SSL证书: ``` InputStream inputStream = getAssets().open("ssl_cert.cer"); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); X509Certificate x509Certificate = (X509Certificate) certificateFactory.generateCertificate(inputStream); inputStream.close(); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); keyStore.setCertificateEntry("ssl_cert", x509Certificate); String defaultAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(defaultAlgorithm); keyManagerFactory.init(keyStore, null); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(defaultAlgorithm); trustManagerFactory.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setUseWideViewPort(true); webSettings.setBuiltInZoomControls(true); webSettings.setDisplayZoomControls(false); webSettings.setSupportZoom(true); webSettings.setAllowFileAccess(true); webSettings.setAllowContentAccess(true); webView.setWebViewClient(new WebViewClient()); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("https://www.example.com"); ``` 通过以上步骤,我们就可以在Android WebView中加载HTTPS安全网页并保持通信的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值