2017-01-14 5 views
2

Retrofitを使用してAndroidでhttpsサーバーに接続しようとしています。私はRealConnectionクラスのデバッグ中にCLEARTEXT communication not supported:例外RetrofitでCLEARTEXT通信がサポートされていません

を得続けるしかし、ここでは私のOkHttpClient

@Provides 
public OkHttpClient provideContactClient(){ 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) 
     .tlsVersions(TlsVersion.TLS_1_2) 
     .cipherSuites(CipherSuite.TLS_RSA_WITH_DES_CBC_SHA, 
      CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256, 
      CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256) 
     .build(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    SSLSocketFactory sslSocketFactory = null; 
    try { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(null, null, null); 
    sslSocketFactory = sslContext.getSocketFactory(); 
    }catch (GeneralSecurityException e){ 
    e.printStackTrace(); 
    } 
    return new OkHttpClient.Builder() 
     .addInterceptor(interceptor) 
     .connectionSpecs(Collections.singletonList(spec)) 
     .sslSocketFactory(sslSocketFactory) 
     .authenticator(new Authenticator() { 
     @Override 
     public Request authenticate(Route route, Response response) throws IOException { 
      if(responseCount(response) >= 5){ 
      return null; 
      } 
      String credential = Credentials.basic("user", "pass"); 
      return response.request().newBuilder().header("Authorization", credential).build(); 
     } 
     }) 
     .build(); 
} 

だ私はroute.address()メンバーは、それがBuliderに割り当てられているにもかかわらず、sslSocketFactoryを持っていません注意してください。

+0

「https」URLの代わりに、「http」URLを要求しています。あるいは、おそらく 'https' URLが' http'にリダイレクトしています。 – CommonsWare

+0

これで、httpsに変更した後、「認証パスの信頼アンカーが見つかりません」というメッセージが表示されます。 – hubert

+0

さて、あなたの 'SSLSocketFactory'を取り除いてください。 – CommonsWare

答えて

1

CLEARTEXTメッセージは、httpのURLを直接要求するか、サーバー側のリダイレクト(例:httpsで始まり、次にhttpにリダイレクトする)によって要求されるためです。

「証明書パスの信頼アンカーが見つかりません」というメッセージでは、テストしているAndroid環境の標準証明書でサポートされていないSSL証明書がサーバーに使用されているようです。たとえば、サーバーが自己署名入りのSSL証明書を使用しているとします。

のオプションがあります。

+0

私はアクセスしようとしているサイトで私に与えられた証明書でこれをすべて行いました。それでも同じエラー。 – hubert

+0

@hubert:あなたに証明書を渡した人と話し、それを使ってそれを解決してください。 – CommonsWare

関連する問題