22

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

4

8 回答 8

53

由于我也对您的问题感兴趣,因此我检查了 WebView 和 WebViewClient 的文档,四处浏览,确实看起来您无法使用客户端证书对 webview 会话进行身份验证,因为所需的方法 (ClientCertRequestHandler) 不是公共 API。

使用 Android WebView 通过客户端证书连接到安全服务器

在 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 或更高版本,一个大胆(并且不太可能......)的解决方案是尝试使用文件方案从本地存储中加载 web 视图中的证书:

将本地 HTML 文件加载到 WebView

但我强烈怀疑 webview 会像浏览器一样运行......

解决方案3:(应该可以,但需要很多努力)

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

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

你有我的同情。

于 2013-03-23T17:45:26.273 回答
9

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

于 2015-03-11T08:26:52.960 回答
9

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

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

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

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

于 2015-09-04T20:31:49.073 回答
7

为了根据更新的安全政策正确处理 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();
}

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

于 2016-07-15T06:34:05.980 回答
3

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

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

于 2014-03-16T17:47:59.753 回答
0

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

于 2013-11-18T12:47:50.243 回答
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 bad request”。

于 2020-07-26T00:56:21.227 回答
-1

自签名 SSL 证书对我有用

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

于 2018-02-27T09:55:22.480 回答