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

Hallo found.NETWORK bekam ich diesen Fehler, während ich von Retrofit einen API-Service nenne, ich bin viel und fand Antwort wiejava.security.cert.CertPathValidatorException: Vertrauen Anker für Zertifizierungspfad nicht

Suche
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); 
} 

nach setSSLFactoryForClient Methode funktioniert gut, aber ich konnte nicht verstehen, was falsch läuft und was diese Methode funktioniert weiß, dass ich das Problem auf SSL-Zertifikat-Authentifizierung verwandt ist, aber Kann jemand mir erklären, diese in Kürze Bitte

Antwort

1

diese deaktiviert die Sicherheit von SSL. Dies ist für lokale Tests in Ordnung, aber nicht für die Verwendung mit echten Benutzern geeignet.

Wenn Sie Ihren lokalen Dev-Server mit einem selbstsignierten Zertifikat ausführen, können Sie ihm so sagen, dass er sich mit minimalen Schmerzen verbinden muss.

Generell wird jeder Benutzeragent (Firefox unter Windows, Safari auf dem Mac, Android) eine Liste der Stammzertifizierungsstellen haben, denen er vertraut, um die Zertifikate einer Website zu verifizieren. Einige neuere Dienste wie "Let's Encrypt" werden auf älteren Plattformen nicht mehr als vertrauenswürdig eingestuft, sodass Sie Ihre eigenen Zertifikate hinzufügen können, die Sie bereits im Voraus kennen.

Die Überprüfung des Hostnamens bedeutet, dass das bereitgestellte Zertifikat auch für eine andere Site verwendet werden kann.

Für echten Verkehr bedeutet dieser Code, dass Ihre Benutzer in den mittleren Angriffen für Menschen anfällig sind.

+0

Vielen Dank Yuri !! Wenn ich die URL ändere (alle Methoden ändern nur URL) auf andere Server geben Sie mir perfekte Antwort, ist es bedeutet, dass der Server, wo URL keine Antwort geben Sie eine Sicherheitsbarriere und diesen Code umgehen, dass –

+0

"Dies ist die Sicherheit deaktivieren von SSL. Dies ist für lokale Tests in Ordnung, aber nicht für die Verwendung mit echten Benutzern geeignet. " Wie Sie gesagt haben, was der richtige Weg ist, um dieses Problem zu lösen –

+0

Wenn der andere Server ein gültiges Zertifikat generiert, das von anderen Clients akzeptiert wird, z. kräuseln Sie sich auf Ihrem Desktop. Dann ist es wahrscheinlich das Problem, das Zertifikat, das es ausgibt, zur Laufzeit oder über das Keytool dem Truststore hinzuzufügen. z.B. https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java Wenn der andere Server nur ein Testzertifikat verwendet, dann Ihren Code, falls zutreffend testen. –

Verwandte Themen