我创建了一个使用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)
问题可能是Android版本(目前为5.1)吗?
答案 0 :(得分:0)
每次调用onReceivedClientCertRequest
方法,服务器端,都需要客户端身份验证。这不是Web服务器的常用服务(当然Youtube根本不需要客户端身份验证),因此您不能强制执行任何操作。此外,onReceivedClientCertRequest
方法是一个监听器,因此默认情况下它依赖于要触发的外部输入,因为Web服务器从不向您的浏览器代理(例如WebView)请求客户端证书,您的代码永远不会被执行。 / p>
有关详细信息,请参阅Android guide to Client Certificate和how SSL works in 2-way handshake