Я получаю проблему с CertPathValidatorException в webview

#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 отклонил мое приложение: