解决Android WebView HTTPS证书校验问题

2 下载量 187 浏览量 更新于2024-09-01 收藏 402KB PDF 举报
"Android webview手动校验https证书(by 星空武哥) - 解决Android系统bug导致的webview加载https证书问题" 在Android应用程序中,WebView组件常用于加载网页内容,包括HTTPS加密的网站。然而,由于Android系统的某些bug或其他原因,可能会导致WebView无法正确验证HTTPS证书,从而影响网页的正常加载。比如,华为Mate7手机升级到Android 7.0后,部分网站可能无法打开,但在更新了WebView的补丁后问题即可得到解决。这突显了系统bug对混合开发中WebView加载HTTPS地址的影响。 当WebView尝试加载HTTPS地址并遇到证书错误时,它会触发`onReceivedSslError()`回调方法。默认情况下,系统会调用`super.onReceivedSslError()`,这会导致加载页面显示为白屏,因为错误处理机制选择了安全的取消加载。开发者有时会选择调用`handler.proceed()`来强制加载页面,但这将使HTTPS证书的验证失去作用,可能导致安全风险。 为了解决这个问题,可以采取手动校验HTTPS证书的方式来确保安全性和正确性。具体步骤如下: 1. 首先,需要获取目标网站的证书。这可以通过使用谷歌浏览器访问网站,开启开发者工具(按F12键),然后在开发者工具中找到并导出证书。 2. 导出的证书通常为PEM格式,可以使用文本编辑器查看其内容。证书信息中包含了SHA256指纹,这是用于验证证书的哈希值。 3. 使用在线工具,如`http://www.atool.org/file_hash.php`或`http://tools.jb51.net/`, 计算导出的证书文件的SHA256哈希值。将这个计算出的哈希值与服务器提供的证书哈希值进行比对。 4. 在`onReceivedSslError()`回调中,添加自定义的证书校验逻辑。如果手动校验通过,即SHA256哈希值匹配,则调用`handler.proceed()`继续加载页面;若校验失败,可以选择显示错误信息或者直接结束应用,以避免加载不受信任的网页。 通过这样的手动校验,可以在系统bug导致默认验证失败的情况下,依然保证对HTTPS证书的严谨检查,从而保护用户的网络安全,同时也解决了因系统问题导致的加载异常。需要注意的是,这种方法应该作为临时解决方案,因为长期忽视证书验证可能会引入安全隐患。在可能的情况下,应优先修复系统bug或更新WebView组件以获得更安全的行为。