IT技术博客大学习 共学习 共进步

[Android]用WebView访问证书有问题的SSL网页

idv2 2013-09-02 13:15:49 浏览 2,747 次

   在WebView里加载SSL网页很正常,也没什么难度。但如果要加载的SSL页面的证书有问题,比如过期、信息不正确、发行机关不被信任等,WebView就会拒绝加载该网页。PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。

WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

        // *** NEVER DO THIS!!! ***
        // super.onReceivedSslError(view, handler, error);

        // let's ignore ssl error
        handler.proceed();
    }
}

   只需像这样重载WebViewClient的onReceivedSslError()函数并在其中执行handler.proceed(),即可忽略SSL证书错误,继续加载页面。

   这里要注意的是,千万不要调用super.onReceivedSslError()。这是因为WebViewClient的onReceivedSslError()函数中包含了一条handler.cancel()(见源码,其含义是停止加载,所以如果调用了super.onReceivedSslError(),其结果就是第一次访问时无法加载,第二次以后可以加载(不知道为什么),而且还可能发生libc的段错误:

A/libc: Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1)

建议继续学习

  1. SSL证书的分类(按功能) (阅读 10,162)
  2. nginx 使用 ssl (阅读 7,564)
  3. 解决linux下安装ssl后,apache重启时需要密码 (阅读 6,384)
  4. SSL Proxy (阅读 5,043)
  5. 通过ssldump来分析ssl协议过程 (阅读 3,904)
  6. SSL窃听攻击实操 (阅读 3,765)
  7. 网页与原生App如何交互 (阅读 3,642)
  8. 微信webview模拟器 (阅读 3,602)
  9. 给Nginx配置一个自签名的SSL证书 (阅读 3,543)
  10. Linux下自行颁发SSL证书 (阅读 2,762)