Android APP之WebView如何校验SSL证书

Android系统的碎片化很严重,并且手机日期不正确、手机根证书异常、com.google.android.webview
BUG等各种原因,都会导致WebViewClient无法访问HTTPS站点。SSL错误的处理方式十分关键,如果处理不当,可能导致中间人攻击,黑客窃听数据,进而引发安全事故。

严谨地处理onReceivedSslError尤为重要。请参考以下代码,原理是:如果webview报告SSL错误,程序将会对服务器证书进行强校验,如果服务器传入证书的指纹(sha256)与记录值一致,说明webview验证过程存在缺陷(如:手机日期错误、根证书被删除
等),忽略SSL错误;如果证书匹配失败,表明数据通信有问题,保留阻断。

请先点击 这里,获取证书的指纹(sha256),然后调整代码中的MySSLCNSHA256数组变量。如果APP需要访问多张证书,请在代码中加入多个证书指纹数值。在测试代码时,请将手机日期设置在证书有效期之前,判断WebView是否能正常访问HTTPS站点。

webview.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
	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[] MySSLCNSHA256 = { 35, 76, 110, -121, -68, -104, -12, 84, 39, 119, -55,
    		101, 95, -8, -90, 9, 36, -108, 5, -57, 76, -98, -19, -73, 91, -37, 18,
    		64, 32, -41, 0, 109 };  //证书指纹
    	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 ByteArrayInputSteam(bytes));
	            MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
	            byte[] Key = sha256.digest(((X509Certificate) ca).getEncoded());
	            return Arrays.equals(key, MySSLCNSHA256);
    		} catch (Exception Ex) {}
    	}
    	return false;
    }
}

原创文章,转载请注明文章来源 https://www.myssl.cn

时间: 2024-08-05 07:08:46

Android APP之WebView如何校验SSL证书的相关文章

为你的android App实现自签名的ssl证书(https)

不愿意看啰嗦的可以直接去          实现步骤 最近公司项目用到https的接口形式,对于一般的网络请求 我们用的是http://******      使用的是 代码用来打开一个 http 连接. URL urlConnection = new URL("http://www.codeproject.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 不要在 ht

通过Appium获取Android app中webview

因为要测试Android app中嵌入的web页面,所以需要从native切换到webview.网上查了好多帖子,都用到类似下面代码: //判断是否有 WEBVIEWSet<String> contextNames = driver.getContextHandles();for (String contextName : contextNames) {System.out.println(contextName);if (contextName.contains("WEBVIEW&

openssl校验SSL证书public是否配对

今天遇到一个很少遇到的关于SSL证书申请.安装问题,简要记录下来. 背景:SSL证书是private key + public key一起工作才能完成加密过程的. 大致来说就是client在handshake过程中先拿public key加密发送随机session encryption key set以及其它关键信息,通过public key密码的报文只能通过server端安装的SSL certificate key pair中的private key才能进行解密. 如果private key与

Android WebView访问SSL证书网页(onReceivedSslError)

Android WebView访问https SSL证书网页,如淘宝,需要在onReceivedSslError添加SSL支持 webview.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 不要使用super,否则有些手机访问不了,因为包含了一条 handler.c

八大免费SSL证书-给你的网站免费添加Https安全加密

评论? https://www.freehao123.com/top-8-free-ssl-cert/ 文章目录 Let's Encrypt StartSSL SSL CloudFlare SSL Wosign沃通SSL 腾讯云DV SSL 免费SSL总结 SSL证书,用于加密HTTP协议,也就是HTTPS.随着淘宝.百度等网站纷纷实现全站Https加密访问,搜索引擎对于Https更加友好,加上互联网上越来越多的人重视隐私安全,站长们给网站添加SSL证书似乎成为了一种趋势. 给自己的网站添加SS

android中使用https是否对服务证书合法性校验的新的体会

package com.cetcs.logreport.utils; import android.content.Context; import org.apache.http.conn.ssl.SSLSocketFactory; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.net.U

Https系列之四:https的SSL证书在Android端基于okhttp,Retrofit的使用

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 先来回顾一下 前面已分别介绍了https,SSL证书的生成,并完成了服务器端的https的部署并提到一

部署沃通SSL证书解决ios7.1的app下载问题

问题描述 最近苹果发布了IOS7.1.话说苹果每次发布都牵动开发者的心哈.苹果从ios7.1开始,用户安装app,需要使用https协议,来下载plist文件.也就说,在安装app的第一步,下载.plist文件,需要使用https协议.https协议如下: 这里不详细描述https协议.简单描述,用户使用https来下载.plist文件.则需要网站支持https协议.支持https协议,除了服务端做一些配置外,还需要申请一张服务器SSL证书,这个SSL证书必须是受信任的CA机构发的(如沃通WoS

部署SSL证书解决ios7.1的app下载问题

一.  问题描述 最近苹果发布了IOS7.1.话说苹果每次发布都牵动开发者的心哈.苹果从ios7.1开始,用户安装app,需要使用https协议,来下载plist文件.也就说,在安装app的第一步,下载.plist文件,需要使用https协议.https协议如下: 这里不详细描述https协议.简单描述,用户使用https来下载.plist文件.则需要网站支持https协议.支持https协议,除了服务端做一些配置外,还需要申请一张服务器SSL证书,这个SSL证书必须是受信任的CA机构发的(如沃