java.security.cert.CertPathValidatorException: доверенная привязка для пути сертификации не найдена.NETWORK

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.NETWORK

Привет, я получил эту ошибку, в то время как я звоню один сервис API от модернизации, я ищу много и нашел ответ, как

private static void setupRestClient() {


        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(ROOT)
                //.setClient(new OkClient(new com.squareup.okhttp.OkHttpClient()))
                //.setClient(getOkClient())
                .setClient(setSSLFactoryForClient(new com.squareup.okhttp.OkHttpClient()))
                .setRequestInterceptor(new SessionRequestInterceptor())
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setLog(new AndroidLog(NetworkUtil.APP_TAG))
                .build();


        REST_CLIENT = restAdapter.create(Restapi.class);
    } 

// SET SSL
public static OkClient setSSLFactoryForClient(OkHttpClient client) {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();


        client.setSslSocketFactory(sslSocketFactory);
        client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return new OkClient(client);
}

После использования метода setSSLFactoryForClient он работает нормально, но я не могу понять, что происходит неправильно, и что делает этот метод, я знаю, что проблема связана с аутентификацией SSL-сертификата, но кто-нибудь может объяснить мне это вкратце?

1 ответ

Решение

Это отключение безопасности SSL. Это нормально для локального тестирования, но не подходит для использования с реальными пользователями.

Если вы запускаете свой локальный dev-сервер с самозаверяющим сертификатом, тогда вы можете сказать, что он подключается к нему с минимальными трудностями.

В более общем случае любой пользовательский агент (Firefox в Windows, Safari на Mac, Android) будет иметь список корневых ЦС, которым он доверяет для проверки сертификатов сайтов. Некоторым более новым службам, таким как Let's encrypt, не будут доверять на старых платформах, поэтому вы можете добавить свои собственные сертификаты, которые вы знаете заранее.

Проверка имени хоста означает, что сертификат, который он обслуживает, может быть даже для другого сайта.

Для реального трафика этот код означает, что ваши пользователи восприимчивы к атаке человека посредине.

Другие вопросы по тегам