Android WebView 自动校验https证书解决方案

0 下载量 109 浏览量 更新于2024-08-29 收藏 476KB PDF 举报
"这篇文章主要讲解了如何在Android的Webview中手动校验HTTPS证书,以解决因系统bug或其他原因导致的加载异常问题。" 在Android应用程序中,混合开发时经常使用Webview组件来加载网页内容,包括HTTPS安全连接。然而,有时由于Android系统的bug或者特定设备的问题(如华为Mate7升级到Android 7.0后),Webview可能无法正确验证HTTPS证书,导致网页无法正常打开。为了解决这个问题,我们需要自定义Webview的行为,特别是处理SSL错误的方法。 当Webview尝试加载一个HTTPS网址,如果遇到证书问题,系统会触发`onReceivedSslError()`方法。通常,如果不进行特殊处理,Webview会通过调用`super.onReceivedSslError()`来取消加载,展示白屏,以保护用户免受潜在的安全风险。但这样做会忽视证书验证,失去HTTPS的安全性。 为了在保证安全的同时解决这个问题,我们可以手动校验证书。首先,我们需要捕获`onReceivedSslError()`中的错误,并且获取网站的证书信息。这可以通过在谷歌浏览器中打开目标网址,启用开发者工具,然后导出证书。接着,可以使用在线工具(如http://www.atool.org/file_hash.php 或 http://tools.jb51.net/password/sha_encode)计算证书的SHA256哈希值。 下面是一个简单的代码示例,展示了如何实现手动证书校验: ```java public class CustomWebViewClient extends WebViewClient { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 获取当前加载的URL String url = view.getUrl(); // 手动校验证书,这里仅作演示,实际应使用获取的证书SHA256值进行比较 boolean isValid = false; // 假设这里进行了校验 if (isValid) { // 证书有效,允许加载页面 handler.proceed(); } else { // 证书无效,提示用户并停止加载 Toast.makeText(context, "证书校验失败,无法安全加载页面", Toast.LENGTH_SHORT).show(); handler.cancel(); } } } // 使用自定义的WebViewClient webView.setWebViewClient(new CustomWebViewClient()); ``` 这段代码中,`isValid`变量应该根据实际获取的证书SHA256值与预期值的比较结果来设置。如果校验通过,调用`handler.proceed()`继续加载页面;否则,调用`handler.cancel()`阻止加载并给出相应提示。 通过自定义Webview的错误处理机制并手动校验证书,可以在确保安全性的同时,避免因系统bug或其他因素导致的加载失败问题。这种方法对于混合开发的应用程序尤其重要,因为它允许开发者控制证书验证流程,提高用户体验。