带有客户端证书的android webview

时间:2013-03-23 15:59:19

标签: android ssl webview client certificate

我试过几天使用带有嵌入在应用程序中的客户端证书的Web视图,但在我看来,android sdk没有提供任何方法来执行此操作,是否有回调来拦截由服务器?有没有办法将webview与客户端证书一起使用并发出https请求?

8 个答案:

答案 0 :(得分:52)

由于我也对你的问题感兴趣,我检查了WebView和WebViewClient的文档,浏览过,看起来你无法使用客户端证书验证webview会话,因为它是必需的方法(ClientCertRequestHandler)不是公共API。

Using a Android WebView to connect to secure server with Client Certificate

Android安全讨论中的搜索确认该呼叫确实无法使用:

https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J

,即使

  

Android 4.0版本确实包含对浏览器中客户端证书身份验证的支持。

(参考:https://code.google.com/p/android/issues/detail?id=8196

没有提及WebViews :(

即使有一些新的API来加载钥匙串中的证书:

http://developer.android.com/reference/android/security/KeyChain.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html

目前还不清楚WebView是否会使用它们......所以我猜你应该尝试KeyChain类,看看你是否可以正确验证(我没有简单的方法来测试它,所以你是独立的)

如果KeyChain无法与WebViews一起使用,我想这一切都归结为几个远非完美的解决方法:

解决方案1:

无论如何都使用ClientCertRequestHandler(它被标记为隐藏,但显然仍然可用):

https://code.google.com/p/android/issues/detail?id=53491

然而,即使假设你做到了,Android Dev。团队可能会修改/删除该方法,恕不另行通知,您的应用可能会停止处理SO的未来版本。

解决方案2:

如果您可以将目标限制为Android 4.0或更高版本,则大胆(且不太可能......)的解决方案是尝试使用文件方案从本地存储中加载Webview中的证书:

Load local HTML file into WebView

但我强烈怀疑webview的行为与浏览器一样......

解决方案3:(这应该有效,但需要付出很多努力)

使用HTTPClient或HttpURLConnection处理后台的每个https连接,然后将数据传递给WebView:

http://chariotsolutions.com/blog/post/https-with-client-certificates-on/

你有同情心。

答案 1 :(得分:9)

如果您只需要忽略Web视图中的ssl证书请求,这对我在Lollipop上有用:

在您的网络视图客户端中,覆盖:

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

这对于针对qa / dev / stage环境调试webview非常有用。

答案 2 :(得分:8)

在API 21(Android Lollipop)及更高版本中,您可以覆盖 WebViewClient.onReceivedClientCertRequest(WebView视图,ClientCertRequest请求)。在该方法中,使用密钥管理器获取私钥和​​证书链,并调用 request.proceed()

答案 3 :(得分:5)

要正确处理SSL证书验证,以防止应用根据更新的安全策略拒绝Google Play,只要服务器提供的证书符合您的期望,就更改您的代码以调用SslErrorHandler.proceed(),并调用SslErrorHandler.cancel(否则。

例如,我添加了一个警告对话框,以便用户确认并且Google似乎不再显示警告。

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }
        message += " Do you want to continue anyway?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

更改后,它不会显示警告。

答案 4 :(得分:3)

Android 4.4上基于Chronium的WebView引入了一个错误:当服务器请求客户端证书时,WebView会停止加载过程。将立即调用 onPageFinished -Method,但不会显示任何页面。

- > https://code.google.com/p/android/issues/detail?id=62533

答案 5 :(得分:0)

我们无法在webview中访问客户端证书, 有同样的谷歌问题。 https://code.google.com/p/android/issues/detail?id=53491

答案 6 :(得分:0)

自签名SSL证书对我有用

请检查此回答https://stackoverflow.com/a/49003522/5058630

答案 7 :(得分:0)

自API 21起,

onReceivedClientCertRequest()已添加到WebViewClient。 https://developer.android.com/reference/android/webkit/WebViewClient#onReceivedClientCertRequest(android.webkit.WebView,%20android.webkit.ClientCertRequest)

以下Stackoverflow帖子中的解决方案为我工作: Android WebView handle onReceivedClientCertRequest

要测试:

未设置客户端证书时,您会看到“ 400错误的请求”。

相关问题