#android #ssl #webview #ssl-certificate #self-signed
#Android #ssl #webview #ssl-сертификат #самоподписанный
Вопрос:
Это мой 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. Я не получаю журналы, которые я добавил внутри этой функции «. Что я делаю не так?
Также это разрешения, которые у меня есть, я не знаю, нужно ли мне больше или нет:
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());
}
Но не повезло.
Ответ №1:
Класс MyWebViewClient()
содержит обработчик ошибок SSL. Вы правильно установили его в строке 4 вашего фрагмента кода:
wv.setWebViewClient(new MyWebViewClient());
Однако в строке 12 вы вызываете снова wv.setWebViewClient(...)
, который заменяет ранее установленный WebViewClient. Следовательно, код никогда не вызывается…
Комментарии:
1. Спасибо, пропустил это. очистит его и проверит снова
2. Я все еще получаю это: «10-12 17:21:40.168: I / X509Util(14061): не удалось проверить цепочку сертификатов, ошибка: java.security.cert. CertPathValidatorException: привязка доверия для пути сертификации не найдена «. Ошибка. Он вводит этот код, и я получаю свои журналы. и вызывается handler.proceed. но он ничего не загружает. Я попробовал vw.setCertificate(error.GetCertificate()) внутри onReceivedSslError, но я получаю то же самое. И если я делаю wv.GetCertificate, он говорит, что он равен нулю (он не сохраняет его). Как я могу добавить сертификат в Webview?
3. попробуйте удалить суперзвонок в вашем
onReceivedSslError
. Он выполняетсяhandler.cancel()
.4. Удаление onReceivedSslErro и здесь сработало! Спасибо!
5. Это больше не работает… Я думал, что это так, но через несколько часов Google отклонил мое приложение: