因为我也对你的问题感兴趣,所以我检查了 WebView 和 WebViewClient 的文档,浏览了一下,确实看起来你无法使用客户端证书对 webview 会话进行身份验证,因为所需的方法 (ClientCertRequestHandler) 不是公共API。
使用 Android WebView 通过客户端证书连接到安全服务器 https://stackoverflow.com/questions/12807742/using-a-android-webview-to-connect-to-secure-server-with-client-certificate
在Android安全讨论中搜索确认该调用确实不可用:
https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J
即使
Android 4.0 版本确实支持浏览器中的客户端证书身份验证。
(ref: https://code.google.com/p/android/issues/detail?id=8196 https://code.google.com/p/android/issues/detail?id=8196)
没有提及 WebViews :(
尽管有一些新的 API 可以在钥匙串中加载证书:
http://developer.android.com/reference/android/security/KeyChain.html http://developer.android.com/reference/android/security/KeyChain.html
http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html
目前尚不清楚 WebView 是否会使用它们......所以我想你应该尝试 KeyChain 类,看看是否可以正确进行身份验证(我没有简单的方法来测试这一点,所以你只能靠自己了)。
如果 KeyChain 不适用于 WebViews,我想这一切都可以归结为几个远非完美的解决方法:
解决方案一:
无论如何使用 ClientCertRequestHandler (它被标记为隐藏,但显然仍然可用):
https://code.google.com/p/android/issues/detail?id=53491 https://code.google.com/p/android/issues/detail?id=53491
然而,即使假设你成功了,Android 开发人员也会这么做。团队可能会在不通知的情况下修改/删除该方法,并且您的应用程序可能会停止在 SO 的未来版本上运行。
解决方案2:
如果您可以将目标限制为 Android 4.0 或更高版本,一个大胆(且不太可能...)的解决方案是尝试使用文件方案从本地存储加载 Web 视图中的证书:
将本地 HTML 文件加载到 WebView 中 https://stackoverflow.com/questions/5749569/load-local-html-file-into-webview
但我强烈怀疑 webview 的行为会像浏览器一样......
解决方案3:(这应该有效,但需要付出很多努力)
使用 HTTPClient 或 HttpURLConnection 在后台处理每个 https 连接,然后将数据传递给 WebView:
http://chariotsolutions.com/blog/post/https-with-client-certificates-on/ http://chariotsolutions.com/blog/post/https-with-client-certificates-on/
我对你表示同情。