web-dev-qa-db-ja.com

CLEARTEXT通信はRetrofitではサポートされていません

Android Retrofitを使用してhttpsサーバーに接続しようとしています。これが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();
}
_

ただし、_CLEARTEXT communication not supported:_例外が発生し続ける

RealConnectionクラスをデバッグしているときに、Buliderで割り当てられているにもかかわらず、route.address()メンバーにsslSocketFactoryがないことに気付きました。

28
hubert

sesCleartextTraffic

manifest.xmlファイルでtools:replace = "Android:usesCleartextTraffic"を使用します

0
Nagraj Naveen

また、「CLEARTEXT通信がサポートされていない例外」は、OkHttpライブラリによって古いAndroidデバイス(6.0、5.0、5.1など))でも簡単に生成される場合があります。 https/tls ConnectionSpec設定。