Android的WebView中使用客户端证书(android webview with clien

2019-07-22 21:34发布

我想了好几天使用带有内嵌在应用程序客户端证书的Web视图,但在我看来,在Android SDK不提供任何办法做到这一点,是有一个回调拦截由服务器发送的挑战是什么? 是那里使用WebView客户端证书,并HTTPS请求的方法吗?

Answer 1:

由于我感兴趣的是你的问题还有,我查的WebView和WebViewClient文档,冲浪周围,确实看起来,你不能使用客户证书进行验证网页视图会话,如所需的方法(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 )

没有关于网页视图提及:(

即使有一些新的API在钥匙扣加载证书:

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

目前尚不清楚的WebView中是否会使用它们。所以我想你应该尝试钥匙串类,看看你是否能正确地进行身份验证(我有没有简单的方法来测试这一点,所以你是你自己)。

如果钥匙串没有与网页视图的工作 ,我想这一切都归结为一对夫妇远非完美的解决方法:

解决方案1:

使用ClientCertRequestHandler反正(它标记为隐藏,但显然仍然可用):

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

然而,即使假设你把它的Android开发人员。 团队可能修改/删除的方法,恕不另行通知您的应用程序可能会停止对SO的未来版本的工作。

方案2:

如果你可以限制你的目标至Android 4.0或更高版本,一个大胆的(且不太可能......)的解决方法是尝试从使用文件格式的本地存储加载web视图证书:

加载本地HTML文件到的WebView

但我强烈怀疑的WebView将表现为浏览器...

解决方案3:(这应该工作,但需要大量的努力)

使用了HTTPClient或HttpURLConnection的处理在每一个背景https连接,然后将数据传递给web视图:

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

你有我的同情。



Answer 2:

如果你只需要忽略网页视图中的SSL证书请求,这为我工作的棒棒糖:

您的内部网络视听客户端,覆盖:

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

这对于调试针对QA的/ dev /舞台环境网页视图是有用的。



Answer 3:

在API 21(的Android棒棒糖)和更高可以重写WebViewClient.onReceivedClientCertRequest(web视图视图,ClientCertRequest请求)。 在该方法中,使用密钥管理器用于获取私钥和证书链,并调用request.proceed()。



Answer 4:

要正确处理SSL证书验证,根据更新的安全策略,以防止应用程序从排斥来自谷歌游戏,更改您的代码来调用SslErrorHandler.proceed()无论何时由服务器提供的凭证符合您的期望,和(),否则调用SslErrorHandler.cancel。

例如,我添加一个警告对话框,使用户证实,似乎谷歌不再显示警告。

    @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();
}

在这之后改变了它不会显示警告。



Answer 5:

在Android 4.4 Chronium基于WebView中引入了一个错误:当服务器请求客户端证书,web视图停止加载过程。 该onPageFinished -方法将被立即调用,但不显示页面。

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



Answer 6:

我们不能在网页视图访问客户端证书,没有提出一个相同的问题,谷歌。 https://code.google.com/p/android/issues/detail?id=53491



Answer 7:

自签名证书为我工作

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



文章来源: android webview with client certificate