Android - закрепление сертификатов с помощью Retrofit 2.3 и OkHTTP

Здравствуйте уважаемые разработчики,

У меня есть следующая проблема:

Я успешно использую прикрепление сертификатов уже несколько месяцев, с OkHTTP 3.6 и Retrofit 1.9.0.

Недавно я обновил используемую версию Retrofit до 2.3.0 и начал использовать OkHttp 3.8. Поскольку обновления Pinning сертификата больше не работают на устройствах между AN 4.1 и AN 6.0.

Я пытался использовать разные версии OkHTTP, но безуспешно. Кроме того, я пытался навязать использование определенной версии OkHTTP через Gradle, но это ничего не изменило.

Вот код, который мы используем для закрепления:

public CertificatePinner provideCertificatePinner(@PinForDomain(DEUTSCHE_POST) final PinnedDomain deutschePost, @PinForDomain(NOVOMIND) final PinnedDomain novomindPin, @PinForDomain(EMMI) final PinnedDomain emmiPin) {
    Log.d(LOG_TAG, "Creating CertificatePinner");
    final CertificatePinner.Builder builder = new CertificatePinner.Builder();
    builder.add("www.url.com", "sha256Key");
    return builder.build();
}

public OkHttpClient provideOkHttpClient(CertificatePinner pinner) {

    Log.d(LOG_TAG, "Creating OkHttpClient");
    final OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
    clientBuilder.certificatePinner(provideCertificatePinner);
    clientBuilder.connectTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
    clientBuilder.writeTimeout(BuildConfig.WRITE_TIMEOUT, TimeUnit.MILLISECONDS);
    clientBuilder.readTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
    return clientBuilder.build();
}

Поэтому я попробовал следующие вещи:

Принудительное использование TLS v1.2

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
      CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
      CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
      CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
.build();

OkHttpClient client = new OkHttpClient.Builder() 
    .connectionSpecs(Collections.singletonList(spec))
    .build();

И реализация собственной SSLSocketFactory, принудительно использующей TLS v1.2 в Версии под AN 4.1 в соответствии с: https://github.com/square/okhttp/issues/2372

РЕДАКТИРОВАТЬ:

В целях разъяснения. Пайнинг не работает означает, что я могу перехватить соединение между моим приложением и внутренним сервером => "Человек посередине".

Прямо сейчас я совершенно заблудился, как решить эту проблему. Любая помощь приветствуется.

Ура Паскаль

1 ответ

Решение

Я обнаружил, что проблема была вызвана не OKHTTP / Retrofit, а неправильной настройкой на стороне клиента. Будучи довольно новым в этом проекте, я не знал всего этого.

Извините, что беспокою вас, и спасибо за любую помощь, оказанную

Другие вопросы по тегам