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

안녕을 found.NETWORK하지 인증 경로에 대한 신뢰 앵커, 나는는 java.security.cert.CertPathValidatorException : 내가 개조에서 하나 개의 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 서버를 실행하는 경우 최소한의 고통없이 연결할 수있는 방법입니다.

더 일반적으로 모든 사용자 에이전트 (Windows의 Firefox, Mac의 Safari, Android)는 사이트 인증서를 확인하기 위해 신뢰하는 루트 CA 목록을 갖습니다. let 's 암호화와 같은 일부 새로운 서비스는 이전 플랫폼에서 신뢰할 수 없으므로 미리 알고있는 인증서를 추가 할 수 있습니다.

호스트 이름 확인은 제공하는 인증서가 다른 사이트에도있을 수 있음을 의미합니다.

실제 트래픽의 경우이 코드는 사용자가 중간 공격에서 사람에게 감염 될 수 있음을 의미합니다.

+0

감사합니다. 유리! 내가 다른 서버에 URL (모든 메소드 같은 단지 변경 URL)를 변경하면 그것이 나에게 완벽한 응답을주고,이 URL은 응답이 –

+0

"이것은 보안을 사용하지 않도록 설정되어 일부 보안 장벽이 코드 바이 패스를 사용 포기하지 않았다 서버를 의미한다 로컬 테스트에는 적합하지만 실제 사용자에게는 적합하지 않습니다. " 이 문제를 해결하는 올바른 방법보다 무엇을 말했는지 –

+0

다른 서버가 다른 클라이언트가 승인 한 유효한 인증서를 생성하는 경우. 바탕 화면에 곱슬 곱슬합니다. 그런 다음 문제가 발생한 인증서를 런타임에 또는 키 도구를 통해 신뢰 저장소에 추가하는 것이 좋습니다. 예 : https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java 에 적합한 경우 다른 서버는 단지 다음 코드를 테스트 인증서를 사용하는 경우 테스트. –