带有客户端证书的android webview

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

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

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

Android安全讨论中的搜索确认该呼叫确实不可用:

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

即便如此

Android 4.0版本确实支持在浏览器中进行客户端证书身份validation。

(参考: 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中的证书:

将本地HTML文件加载到WebView中

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

解决方案3 🙁应该可以工作,但需要付出很多努力)

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

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

你有同情心。

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

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

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

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

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

要根据更新的安全策略正确处理SSL证书validation以防止应用程序拒绝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(); } 

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

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

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

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

自签名SSL证书对我有用

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