我在 webview 中遇到 CertPathValidatorException 问题
I get an CertPathValidatorException issue in webview
这是我的网页视图:
if(bundle != null){
String file = bundle.getString("url");
Log.i("","url is:" + file);
wv.setWebViewClient(new MyWebViewClient());
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
WebSettings settings = wv.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAppCacheEnabled(false);
settings.setDomStorageEnabled(true);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
loadingPanel.setVisibility(View.GONE);
}
});
wv.loadUrl(file);
}
这是我的 WebViewClient:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
wv.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
super.onReceivedSslError(view, handler, error);
Log.e("","error is certificate:" + error.getCertificate());
Log.e("","error is:" + error.getPrimaryError());
Log.e("","error is url:" + error.getUrl());
handler.proceed();
}
}
我收到此错误:
10-12 13:27:43.174: I/X509Util(14748): Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
另外,"onReceivedSSLError method is not being reached. I do not get the logs that I added inside that function"。我做错了什么?
还有这个是我的权限,不知道是不是还需要:
android.permission.INTERNET"
android.permission.READ_EXTERNAL_STORAGE"
我什至尝试将证书添加到 webview,如下所示:
try {
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
Certificate cer = keyStore.getCertificate("ca");
if(cer != null) {
Log.i("", "certificate is:" + cer);
Log.i("", "certificate is:" + cer.toString());
Log.i("", "certificate is:" + cer.getType());
Log.i("", "certificate is:" + cer.getPublicKey());
X509Certificate x509 = (X509Certificate) cer;
SslCertificate sslCert = new SslCertificate(x509);
wv.setCertificate(sslCert);
}
}catch (Exception e){
Log.e("","error trying to get it:" + e.getMessage());
}
但运气不好。
class MyWebViewClient()
包含 SSL 错误处理程序。您在代码段的第 4 行中正确设置了它:
wv.setWebViewClient(new MyWebViewClient());
但是在第 12 行中您再次调用 wv.setWebViewClient(...)
替换了之前设置的 WebViewClient。因此代码永远不会被调用...
这是我的网页视图:
if(bundle != null){
String file = bundle.getString("url");
Log.i("","url is:" + file);
wv.setWebViewClient(new MyWebViewClient());
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
WebSettings settings = wv.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAppCacheEnabled(false);
settings.setDomStorageEnabled(true);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
loadingPanel.setVisibility(View.GONE);
}
});
wv.loadUrl(file);
}
这是我的 WebViewClient:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
wv.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
super.onReceivedSslError(view, handler, error);
Log.e("","error is certificate:" + error.getCertificate());
Log.e("","error is:" + error.getPrimaryError());
Log.e("","error is url:" + error.getUrl());
handler.proceed();
}
}
我收到此错误:
10-12 13:27:43.174: I/X509Util(14748): Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
另外,"onReceivedSSLError method is not being reached. I do not get the logs that I added inside that function"。我做错了什么?
还有这个是我的权限,不知道是不是还需要:
android.permission.INTERNET"
android.permission.READ_EXTERNAL_STORAGE"
我什至尝试将证书添加到 webview,如下所示:
try {
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
Certificate cer = keyStore.getCertificate("ca");
if(cer != null) {
Log.i("", "certificate is:" + cer);
Log.i("", "certificate is:" + cer.toString());
Log.i("", "certificate is:" + cer.getType());
Log.i("", "certificate is:" + cer.getPublicKey());
X509Certificate x509 = (X509Certificate) cer;
SslCertificate sslCert = new SslCertificate(x509);
wv.setCertificate(sslCert);
}
}catch (Exception e){
Log.e("","error trying to get it:" + e.getMessage());
}
但运气不好。
class MyWebViewClient()
包含 SSL 错误处理程序。您在代码段的第 4 行中正确设置了它:
wv.setWebViewClient(new MyWebViewClient());
但是在第 12 行中您再次调用 wv.setWebViewClient(...)
替换了之前设置的 WebViewClient。因此代码永远不会被调用...