没有在Webview中获得onReceivedClientCertRequest的回调

时间:2016-03-08 15:25:14

标签: android ssl webview ssl-certificate webclient

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

在api 21中添加了

onReceivedClientCertRequest(),但是当我加载任何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);
        }

1 个答案:

答案 0 :(得分:2)

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

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