Retrofit不支持CLEARTEXT通信

时间:2017-01-14 14:17:36

标签: android http ssl retrofit

我正在尝试使用Retrofit连接到Android上的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课程时,我注意到route.address()成员没有sslSocketFactory,尽管它已在Bulider中分配。

5 个答案:

答案 0 :(得分:30)

根据网络安全配置

本节中的指南仅适用于以Android 8.1(API级别27)或更低版本为目标的应用。从Android 9(API级别28)开始,默认情况下禁用明文支持。

创建文件res / xml / network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>

或者您可以像这样直接在清单中设置应用程序。

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

答案 1 :(得分:4)

CLEARTEXT消息是由于直接或通过服务器端重定向请求http URL(例如,以https开头,然后重定向到http)。

就您的&#34;信任锚而言,未找到认证路径&#34;消息,您的服务器似乎正在使用某些SSL证书,该证书在您正在测试的任何Android环境中都没有由标准的证书支持。例如,您的服务器可能正在使用自签名SSL证书。

选项包括:

答案 2 :(得分:2)

仅将其添加到清单(内部应用程序)

android:usesCleartextTraffic="true"

有效!

答案 3 :(得分:0)

如果您请求具有https / tls ConnectionSpec设置的http://主机,则即使由OkHttp库在旧的Android设备(6.0、5.0、5.1等)中也很容易生成“不支持CLEARTEXT通信的异常”。

答案 4 :(得分:0)

usesCleartextTraffic

在manifest.xml文件中使用tools:replace =“ android:usesCleartextTraffic”