【问题标题】:onReceivedClientCertRequest is not called未调用 onReceivedClientCertRequest
【发布时间】:2017-03-07 08:59:12
【问题描述】:

我制作了一个应用程序,它使用 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)?

【问题讨论】:

    标签: java android ssl webview webviewclient


    【解决方案1】:

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

    更多详情请见Android guide to Client Certificatehow SSL works in 2-way handshake

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-10
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多