android webview与客户端证书

我尝试了几天来使用Web应用程序中embedded的客户端证书的web视图,但在我看来,android sdk不提供任何方式来做到这一点,是否有一个callback截获服务器发送的挑战? 有没有办法使用webview与客户端证书,使https请求?

Solutions Collecting From Web of "android webview与客户端证书"

由于我对你的问题感兴趣,所以我检查了WebView和WebViewClient的文档,并且看起来你不能使用客户端证书来validationwebview会话,因为所需的方法(ClientCertRequestHandler)不是公共API。

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

Android安全性讨论中的search确认通话确实不可用:

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

尽pipe如此

Android 4.0版本确实在浏览器中支持客户端证书authentication。

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

没有提到关于WebViews是:(

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

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

目前还不清楚WebView是否会使用它们…所以我想你应该尝试KeyChain类,看看你是否可以正确authentication(我没有简单的方法来testing这个,所以你是自己的)。

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

解决scheme1:

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

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

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

解决scheme2:

如果你可以限制你的目标Android 4.0或更高版本,一个大胆的(不太可能…)的解决scheme是尝试从本地存储使用文件scheme在Web视图中加载证书:

将本地HTML文件加载到WebView中

但我强烈怀疑webview将像浏览器一样行事…

解决scheme3 🙁应该工作,但需要很多努力)

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

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

你有我的同情

如果你只需要忽略Web视图内的SSL证书请求,这对我来说棒棒糖:

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

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

这对debugging针对qa / dev / stage环境的webviews很有用。

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

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

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

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

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

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