Android APP之WebView校验SSL证书的方法
Android系统的碎片化很严重,并且手机日期不正确、手机根证书异常、com.google.android.webviewBUG等各种原因,都会导致WebViewClient无法访问HTTPS站点。SSL错误的处理方式十分关键,如果处理不当,可能导致中间人攻击,黑客窃听数据,进而引发安全事故。
严谨地处理onReceivedSslError尤为重要。请参考以下代码,原理是:如果webview报告SSL错误,程序将会对服务器证书进行强校验,如果服务器传入证书的指纹(sha256)与记录值一致,说明webview验证过程存在缺陷(如:手机日期错误、根证书被删除等),忽略SSL错误;如果证书匹配失败,表明数据通信有问题,保留阻断。
请先点击这里,获取证书的指纹(sha256),然后调整代码中的MySSLCNSHA256数组变量。如果APP需要访问多张证书,请在代码中加入多个证书指纹数值。在测试代码时,请将手机日期设置在证书有效期之前,判断WebView是否能正常访问HTTPS站点。
webview.setWebViewClient(newWebViewClient(){ @Override publicvoidonReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror){ if(error.getPrimaryError()==SslError.SSL_DATE_INVALID//日期不正确 ||error.getPrimaryError()==SslError.SSL_EXPIRED//日期不正确 ||error.getPrimaryError()==SslError.SSL_INVALID//webviewBUG ||error.getPrimaryError()==SslError.SSL_UNTRUSTED){//根证书丢失 if(chkMySSLCNCert(error.getCertificate())){ handler.proceed();//如果证书一致,忽略错误 } } } privatebooleanchkMySSLCNCert(SslCertificatecert){ 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};//证书指纹 Bundlebundle=SslCertificate.saveState(cert); byte[]bytes=bundle.getByteArray("x509-certificate"); if(bytes!=null){ try{ CertificateFactorycf=CertificateFactory.getInstance("X.509"); Certificateca=cf.generateCertificate(newByteArrayInputSteam(bytes)); MessageDigestsha256=MessageDigest.getInstance("SHA-256"); byte[]Key=sha256.digest(((X509Certificate)ca).getEncoded()); returnArrays.equals(key,MySSLCNSHA256); }catch(ExceptionEx){} } returnfalse; } }
以上就是AndroidAPP之WebView校验SSL证书的方法,希望以后大家多多支持毛票票,建议大家继续浏览下一篇文章更精彩。