Подтвердить что ты не робот

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

У меня есть 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.

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

4b9b3361

Ответ 1

Создайте 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(); }});

Ответ 2

Я имел дело с этим, и, откровенно говоря, допускать атаки 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;
}