Android WebView之安全性

Web证书检验

我们查看webview的源码,可以看到,当https证书验证有问题的时候,会回调以下方法

public class WebViewClient {

    public void onReceivedSslError(WebView view, SslErrorHandler handler,
            SslError error) {
        handler.cancel();
    }
}

而系统是默认不使用请求的,即我们平时打开一个页面,有可能看到白屏,没有任何内容,就是这个原因。

我们可以在这个回调方法里面根据返回的错误信息进行相应的处理,可以对服务器下发的证书进行校验(需要预先在客户端保存证书指纹)。如何是CA机构签发的证书,webview内核会去验证此证书的合法性,因为Android系统内置了100多个CA机构的根证书。

webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                switch (error.getPrimaryError()){
                    case SslError.SSL_DATE_INVALID://上期不正确
                        break;
                    case SslError.SSL_IDMISMATCH://host不匹配
                        if(handleSslCheck()){
                            //继续执行
                            handler.proceed();
                        } else {
                            handler.cancel();//取消
                        }
                        break;
                    case SslError.SSL_EXPIRED://证书时间过期
                        break;
                    case SslError.SSL_UNTRUSTED://证书是不受信任的
                        break;
                    case SslError.SSL_INVALID://证书不可用
                        break;
                    case SslError.SSL_NOTYETVALID://证书不再有效
                        break;
                }
            }
        });


/** 
 * SSL证书错误,手动校验https证书 
 * 
 * @param cert      https证书 
 * @param sha256Str sha256值 
 * @return true通过,false失败 
 */  
public static boolean handleSslCheck(SslCertificate cert, String sha256Str) {  
    byte[] SSLSHA256 = hexToBytes(sha256Str);  
    Bundle bundle = SslCertificate.saveState(cert);  
    if (bundle != null) {  
        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, SSLSHA256);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  
    return false;  
}  

html文件安全性

1、对js、css等文件进行混淆

2、Android客户端要与H5之间协商好一套互相信任的安全算法

3、为了避免WebView加载任意url,也需要对url进行白名单检测:

  • 1)WebView:postUrl()前检测url的合法性
  • 2)Js调用Native方法前检测当前界面url的合法性
文章目录
  1. 1. Web证书检验
  2. 2. html文件安全性
|