Ошибка Android в webview.loadUrl () - Целевой якорь для пути сертификации не найден

17

У меня есть webview для URL-адреса нагрузки, но не работает.

Посмотрите на мой код:

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.webView);

    //Log.d("rudyy", "aqui");
    wv.loadUrl("https://tripulanteaims.tam.com.br/wtouch/wtouch.exe/index");
    //Log.d("rudyy", "fim");


  }
}

При выполнении этого кода андроид возвращает эту ошибку:

Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Помогите, пожалуйста.

    
задан user1657394 20.11.2015 в 12:32
источник

2 ответа

38

Создайте WebViewClient:

private class WvClient extends WebViewClient 
{
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
        handler.proceed(); 
        // Ignore SSL certificate errors
    }
}

И установите инициализированный WebViewClient («WvClient») в ваш WebView («wv» в этом случае):

wv.setWebViewClient(new WvClient());

Или в одной строке:

 wv.setWebViewClient(new WebViewClient() {@Override public void onReceivedSslError(WebView v, SslErrorHandler handler, SslError er){ handler.proceed(); }});
    
ответ дан Luca Ziegler 20.11.2015 в 12:43
  • , пожалуйста, примите ... –  Luca Ziegler 20.11.2015 в 14:10
  • будет одинаковым с anon webView.setWebViewClient (новый WebViewClient () {@Override public void onReceivedSslError (представление WebView, обработчик SslErrorHandler, ошибка SslError) {handler.proceed ();}}); –  tyoc213 16.03.2016 в 18:49
  • именно то, что мне нужно. –  MKY 09.03.2017 в 10:20
  • Это просто игнорирует все ошибки SSL. Определенно не очень хорошее решение. –  Mavamaarten 18.04.2017 в 09:18
4

Я имел дело с этим, и, откровенно говоря, допускать атаки MITM - это не-нет. Вот более чистое решение, поддерживающее фиксацию. Сохраните сертификат в своей папке с исходными ресурсами.
ПРИМЕЧАНИЕ. К сожалению, SSLError дает нам SslCertificate, когда вы вызываете getCertificate (). SslCertificate бесполезен. Это общедоступный API, который не позволяет вам проверять открытый ключ, а только созданную по дате, истекшую, выпущенную, выпущенную. Однако, если вы откроете этот класс, вы увидите переменную участника X509Certificate, которая не была открыта. IDK, почему было принято это дизайнерское решение. Но есть API для получения Bundle, и в нем хранится переменная члена сертификата X509. Таким образом, мы обращаемся к нему таким образом, потому что у этого сертификата есть намного более полезные методы.

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    SslCertificate sslCertificateServer = error.getCertificate();
    Certificate pinnedCert = getCertificateForRawResource(R.raw.your_cert, mContext);
    Certificate serverCert = convertSSLCertificateToCertificate(sslCertificateServer);

    if(pinnedCert.equals(serverCert)) {
        handler.proceed();
    } else {
        super.onReceivedSslError(view, handler, error);
    }
}

public static Certificate getCertificateForRawResource(int resourceId, Context context) {
    CertificateFactory cf = null;
    Certificate ca = null;
    Resources resources = context.getResources();
    InputStream caInput = resources.openRawResource(resourceId);

    try {
        cf = CertificateFactory.getInstance("X.509");
        ca = cf.generateCertificate(caInput);
    } catch (CertificateException e) {
        Log.e(TAG, "exception", e);
    } finally {
        try {
            caInput.close();
        } catch (IOException e) {
            Log.e(TAG, "exception", e);
        }
    }

    return ca;
}

public static Certificate convertSSLCertificateToCertificate(SslCertificate sslCertificate) {
    CertificateFactory cf = null;
    Certificate certificate = null;
    Bundle bundle = sslCertificate.saveState(sslCertificate);
    byte[] bytes = bundle.getByteArray("x509-certificate");

    if (bytes != null) {
        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
            certificate = cert;
        } catch (CertificateException e) {
            Log.e(TAG, "exception", e);
        }
    }

    return certificate;
}
    
ответ дан Ryan Newsom 24.04.2017 в 19:41
  • Привет Райан ... нам просто нужно переопределить эти методы? –  RickON 17.09.2017 в 18:03
  • @RickON расширяет WebViewClient и да, переопределяет метод onReceivedSslError. –  Ryan Newsom 18.09.2017 в 22:58
  • FYI. Если вы используете привязку сертификата и сертификат, который вы прикрепляете для изменения, ваше приложение будет ломаться. Просто подумать ... –  Ryan Newsom 01.12.2017 в 22:39