没有在 Webview 中获得 onReceivedClientCertRequest 的回调

Not getting callback for onReceivedClientCertRequest in Webview

我需要为 Webview 执行 Public 密钥/证书固定。我看到 API21 中引入了 api 根据 Android 文档, http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest)

onReceivedClientCertRequest() 添加到 api 21,但是当我加载任何 url 时我没有收到回调。有人可以帮忙吗????

@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
            Log.e("ClientCertRequest", "===> certificate required!");

            KeyChain.choosePrivateKeyAlias(WebViewActivity.this, new KeyChainAliasCallback(){
                @TargetApi(Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void alias(String alias) {
                    Log.e(getClass().getSimpleName(), "===>Key alias is: " + alias);
                    try {
                        PrivateKey changPrivateKey = KeyChain.getPrivateKey(WebViewActivity.this, alias);
                        X509Certificate[] certificates = KeyChain.getCertificateChain(WebViewActivity.this, alias);
                        Log.v(getClass().getSimpleName(), "===>Getting Private Key Success!" );
                        request.proceed(changPrivateKey, certificates);
                    } catch (KeyChainException e) {
                        Log.e(getClass().getSimpleName(), Util.printException(e));
                    } catch (InterruptedException e) {
                        Log.e(getClass().getSimpleName(), Util.printException(e));
                    }
                }
            },new String[]{"RSA"}, null, null, -1, null);
            super.onReceivedClientCertRequest(view,request);
        }

在 Android 中,客户端证书身份验证可能会以多种方式失败:

  • 您的 WebViewClient 可能连接不正确:确保您从 WebView 获得其他通知,例如 WebViewClient.onPageStarted()
  • 确保您实际使用的是 SSL 和 https URL
  • SSL 可能会在您进行客户端证书检查之前失败。这是典型的自签名服务器证书。您可以通过在 WebViewClient.onReceivedSslError(view, handler, error)
  • 中调用 handler.proceed() 来解决此问题
  • 服务器端可能未启用 SSL 客户端证书身份验证。使用 Apache 时,在配置
  • 中设置类似 SSLVerifyClient require 的内容以及所需的参数 SSLVerifyDepthSSLCACertificateFile
  • 在服务器上使用有效的 CA 证书(由您或第三方创建)和由该 CA 证书签署的客户端证书
  • 确保 Android 设备上安装了客户端证书。您通常将客户端证书作为 PKCS 12 文件(pfx 文件扩展名)复制到设备的存储空间