2016-08-19 13 views
2
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.NETWORK 

Привет я получил эту ошибку, пока я звоню одну услугу API от модификации, я ищу много и найти ответ, какjava.security.cert.CertPathValidatorException: Целевой якорь для пути сертификации не found.NETWORK

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) будет иметь список корневых центров сертификации, которым доверяет проверка сертификатов сайтов. Некоторые более новые сервисы, например, зашифровать, не будут доверять старым платформам, поэтому вы можете добавить свои собственные сертификаты, которые вы знаете заранее.

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

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

+0

Большое спасибо Юрию !! когда я изменяю URL-адрес (все методы одинаковы, просто изменяю URL-адрес) на другой сервер, он дает мне отличный ответ, означает ли это, что сервер, на котором URL-адрес не ответил, использует какой-то защитный барьер, а этот код обходит –

+0

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

+0

Если другой сервер генерирует действительный сертификат, принятый другими клиентами, например. завиток на рабочем столе. Затем исправление, вероятно, должно добавить сертификат, который он выдает, в доверительный магазин во время выполнения или через keytool. , например. https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java Если другой сервер просто использует сертификат тестирования, тогда ваш код, если это необходимо, для тестирование. –

 Смежные вопросы

  • Нет связанных вопросов^_^