onReceivedClientCertRequest未调用

时间:2017-03-07 08:59:13

标签: java android ssl webview webviewclient

我创建了一个使用WebView和YouTube iframe观看YouTube视频的应用。我使用WebViewClient来存储所有网址,我想强制使用我生成的私钥,这样我就可以解密Wireshark流量(我使用Android命令行和tcpdump命令在应用程序中捕获该流量)。

我的WebViewClient课程就是这样:

private class MyWebviewClient extends WebViewClient {

    @Override
    public void onReceivedError(WebView view, int errorCode,
                                String description, String failingUrl) {
        // TODO Auto-generated method stub
        super.onReceivedError(view, errorCode, description, failingUrl);
        Log.d(TAG, "onReceivedError : description = " + description);

    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub
        System.out.println("********************************************");
        Log.d(TAG, "shouldOverrideUrlLoading : url = " + url);
        return true;
    }

    @Override
    public void onLoadResource(WebView view, String url) {
        webAppInterface.logResourceURL(url);
        System.out.println("************************************ " + url + " ************************************");
    }

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }

    //forcing my private key
    @Override
    public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
        System.out.println("test test test");

        X509Certificate cert = CertificateKey.getCertificate();
        X509Certificate[] mCertificates = new X509Certificate[1];
        mCertificates[0] = (X509Certificate)cert;

        request.proceed(CertificateKey.getKey(), mCertificates);
    }
}

问题是方法onReceivedClientCertRequest永远不会被调用!我甚至不打印。

  • 所有其他方法按预期工作(即onLoadResource有效)
  • 我正在使用SSL/HTTPS,因为在wireshark捕获的流量中可以看到 wireshark traffic
  • 我在错误的情况下使用方法onReceivedSslError(view, handler, error)
  • 我使用的是自行生成的证书(至少我认为没有CA签名)
  • 证书和私钥都保存在手机上

问题可能是Android版本(目前为5.​​1)吗?

1 个答案:

答案 0 :(得分:0)

每次调用onReceivedClientCertRequest方法,服务器端,都需要客户端身份验证。这不是Web服务器的常用服务(当然Youtube根本不需要客户端身份验证),因此您不能强制执行任何操作。此外,onReceivedClientCertRequest方法是一个监听器,因此默认情况下它依赖于要触发的外部输入,因为Web服务器从不向您的浏览器代理(例如WebView)请求客户端证书,您的代码永远不会被执行。 / p>

有关详细信息,请参阅Android guide to Client Certificatehow SSL works in 2-way handshake