2017-01-14 10 views
2

Я пытаюсь подключиться к серверу https на андроиде с помощью Retrofit. Вот мой OkHttpClientСвязь CLEARTEXT не поддерживается при дооснащении

@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.

+0

Вы делаете запрос URL-адреса 'http', по-видимому, вместо' https'. Или, возможно, URL 'https' перенаправляется на' http'. – CommonsWare

+0

Итак, теперь я получаю «Цепочный якорь для пути сертификации не найден» после перехода на https. – hubert

+0

Теперь избавитесь от 'SSLSocketFactory'. – CommonsWare

ответ

1

читаемое сообщение в связи с просьбой о http URL, либо непосредственно, либо с помощью серверного перенаправления (например, начинается с https, а затем перенаправляет к http).

С точки зрения вашего сообщения о доверии к сертификату не найдено, на вашем сервере, по-видимому, используется некоторый сертификат SSL, который не поддерживается одним из стандартных в любой среде Android, на которой вы тестируете. Например, возможно, ваш сервер использует самоподписанный сертификат SSL.

Варианты включают в себя:

+0

Я сделал все это с сертификатом, который был предоставлен мне для сайта, к которому я пытаюсь получить доступ. По-прежнему такая же ошибка. – hubert

+0

@hubert: Поговорите с людьми, которые дали вам сертификат, и затем обработайте их. – CommonsWare