具有客户端证书的android webview

具有客户端证书的android webview,android,ssl,webview,client,certificate,Android,Ssl,Webview,Client,Certificate,我花了好几天的时间尝试在应用程序中嵌入客户端证书的web视图,但在我看来,android sdk并没有提供任何方法,是否有回调来拦截服务器发送的质询?有没有办法将webview与客户端证书一起使用并发出https请求 因为我也对您的问题感兴趣,所以我查看了WebView和WebViewClient的文档,四处浏览,发现您无法使用客户端证书对WebView会话进行身份验证,因为所需的方法(ClientCertRequestHandler)不是公共API 安卓安全讨论中的搜索确认该电话确实不可用:

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

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

安卓安全讨论中的搜索确认该电话确实不可用:

即使

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

(参考号:)

未提及网络视图:(

尽管有一些新的API可以在密钥链中加载证书:

现在还不清楚WebView是否会使用它们……所以我想你应该试试KeyChain类,看看你是否能够正确地进行身份验证(我没有简单的方法来测试,所以你只能靠自己)

如果KeyChain不适用于WebView,我想这一切都归结为两个远远不够完美的解决方法:

解决方案1:

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

然而,即使假设您成功了,Android开发团队也可能会在不通知的情况下修改/删除该方法,并且您的应用程序可能会停止处理SO的未来版本

解决方案2:

如果您可以将目标限制为Android 4.0或更高版本,一个粗体(不太可能…)解决方案是尝试使用文件方案从本地存储加载webview中的证书:

但我强烈怀疑webview是否会像浏览器那样运行

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

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


我很同情您。

我们无法在webview中访问客户端证书, 谷歌也提出了同样的问题。

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


-->

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

如果您只需要在web视图中忽略ssl证书请求,这对我来说在棒棒糖上很有效:

在web视图客户端中,覆盖:

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

这对于根据qa/dev/stage环境调试Web视图非常有用。

要根据更新的安全策略正确处理SSL证书验证以防止应用程序被Google play拒绝,请更改代码以调用SslErrorHandler.continue()只要服务器提供的证书满足您的期望,否则调用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();
}

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

自签名SSL证书对我有效


请检查此答案

onReceivedClientCertRequest()自API 21添加到WebViewClient。

以下Stackoverflow帖子中的解决方案对我有效:

要测试:

  • 服务器URL:
  • 客户端证书:

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

#刷新。使用此代码片段,您的应用程序在google应用程序验证中被拒绝的几率非常大。这发生在我身上。请注意,这不是“被拒绝的几率非常大”,Play Store会自动检测到此绕过,并拒绝,没有机会:)由于此代码,我的应用程序昨天被拒绝。我不会再使用这个了。@Nickmccomb请仔细阅读答案!正如它所说,“这对于针对qa/dev/stage环境调试WebView非常有用。”这不是针对生产代码的。这个较新的Q看起来是重复的,但显示了新的希望:实际上这确实有效。我只是用一个base64字符串测试它,它是一个证书,立即ping我的服务器并正确显示页面。保持上面的链接,评论说它对未来的旅行者有用!