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