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

私は改造から1つのAPIサービスを呼び出すいながら、こんにちは、私はこのエラーを得たのfound.NETWORKない、私はjava.security.cert.CertPathValidatorException:証明書パスのトラストアンカー

のようにたくさん見つかった答えを探しています
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

他のサーバーが他のクライアントが受け入れている有効な証明書を生成するとします。あなたのデスクトップのカール。そうすれば、発行された証明書を実行時にtruststoreに追加するか、keytoolを使用して証明書を追加することが考えられます。 https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java 他のサーバーがテスト証明書を使用している場合は、適切な場合はあなたのコードテスト。 –

関連する問題