Как включить TLSv1.3 для OkHttp 3.12.x на Android 8/9?

Я использую OkHttp 3.12.2 на Android 9 (устройство Pixel 2) и пытаюсь подключиться к nginx 1.14.0, работающему с OpenSSL 1.1.1. Nginx поддерживает TLSv1.3, я проверил это с Firefox 66.0.2 на Ubuntu 18.04, Chrome 73.0 на Android 9 и ChromeOS 72.0.

Однако OkHttp всегда согласовывает TLSv1.2. Я также пытался установить RESTRICTED_TLS ConnectionSpec, но это не помогло.

Я не нашел конкретной инструкции, как заставить TLSv1.3 работать на Android. Я знаю, что только Android 8 и 9 из коробки поддерживают TLSv1.3; На данный момент я в порядке с этим ограничением.

Мой опыт предыдущих миграций TLS показывает, что мне не нужно ничего делать, кроме обновления всех задействованных компонентов.


person Andreas    schedule 05.04.2019    source источник
comment
На какой сервер вы попадаете? Есть ли в нем TLSv1.3?   -  person Jesse Wilson    schedule 06.04.2019
comment
@JesseWilson Это установка nginx 1.14.0 / OpenSSL 1.1.1 с поддержкой TLSv1.3. Firefox в Ubuntu и Chrome на Android подключаются через TLSv1.3.   -  person Andreas    schedule 06.04.2019


Ответы (2)


Как показано в официальной ссылке, TLSv1.3 поддерживается в Android 10 ( Api Level 29) на подопечных. Поэтому для поддержки TLSv1.3 в предыдущих версиях мы можем интегрировать библиотеку Sovrypt. Поставщик безопасности Conscrypt включает общедоступный API для функциональности TLS. Для этого нам нужно добавить зависимость,

dependencies {
  implementation 'org.conscrypt:conscrypt-android:2.2.1'
}

Здесь также нам понадобится клиент OkHttp, так как он поддерживает Sovrypt.

Как описано в OkHttp,

OkHttp использует встроенную реализацию TLS вашей платформы. На платформах Java OkHttp также поддерживает Conscrypt, который интегрирует BoringSSL с Java. OkHttp будет использовать Conscrypt, если это первый провайдер безопасности.

После добавления зависимости совести в классе приложения мы просто должны упомянуть,

Security.insertProviderAt(Conscrypt.newProvider(), 1);

Это может быть полезно для обеспечения поддержки и включения TLS 1.3 в более старой версии Android (уровень Api ‹29).

person Dhaval Shah    schedule 15.12.2019
comment
Поправьте меня, если я ошибался, код с OkHttp Platform.kt говорит об обратном. Сначала он будет соответствовать android, а затем Conscrypt. Экземпляр ConscryptPlatform не будет возвращен методом Platform.Companion.findPlatform на устройствах Android. - person hqzxzwb; 09.03.2020

Вероятно, проблема в том, что клиент или сертификат могут не поддерживать TLS 1.3 во всех ситуациях, а затем откатятся. Попробуйте запустить тест SSL, чтобы убедиться в этом (он также выполняет проверки для мобильных клиентов, которые могут согласовывать иначе). Обновление OhHttp до 3.13 или 3.14 (скоро) также может быть вариантом; вот журнал изменений. даже если Android должен его поддерживать, клиент также должен быть настроен:

OkHttpClient client = new OkHttpClient.Builder()
    .connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS))
    .build();

Возможные значения: RESTRICTED_TLS, MODERN_TLS и (назад) COMPATIBLE_TLS.

person Martin Zeitler    schedule 06.04.2019
comment
Я должен был упомянуть, что я уже провел тест SSL и прошел тесты TLSv1.3. Поддерживаются все наборы шифров TLSv1.3: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 и TLS_AES_128_GCM_SHA256. - person Andreas; 06.04.2019
comment
@AndreasSchildbach (обновление и / или) явная установка MODERN_TLS или RESTRICTED_TLS все равно может привести к согласованию другого протокола. не знаю, какое значение по умолчанию. - person Martin Zeitler; 06.04.2019
comment
Боюсь, я не могу выполнить обновление до OkHttp 3.13 и выше, потому что Square слишком сильно увеличила требования для меня (для использования языковых функций Java 8 требуется недавний плагин Android Gradle, который нарушает детерминированные сборки из-за давней ошибки). Но говорят, OkHttp 3.12.x получает бэкпорты. - person Andreas; 06.04.2019
comment
Как я уже упоминал в описании, я установил для клиента RESTRICTED_TLS. По умолчанию MODERN_TLS afaik, что тоже не работает. - person Andreas; 06.04.2019
comment
@AndreasSchildbach была зарегистрирована ошибка javax.net.ssl: bugs.openjdk.java.net/browse/ JDK-8202625 и bugs.java.com/bugdatabase/view_bug. do? bug_id = 8202625 убедитесь, что это не влияет на используемую вами версию. тестирование с помощью Только клиент TLS 1.3 также может помочь устранить виновника. - person Martin Zeitler; 06.04.2019
comment
У меня внезапно возникает ощущение, что Android 9 еще не поддерживает TLSv1.3, хотя я вспомнил, что читал об этом 2 года назад. Я просто пробовал запустить SSLContext.getInstance("TLSv1.3");, но получил java.security.NoSuchAlgorithmException: TLSv1.3 SSLContext not available. И журнал изменений для Android Q (неизданный) упоминает об этом как о новой функции. . - person Andreas; 06.04.2019
comment
Да, вам нужен Q. twitter.com/jessewilson/status/1106035125878513664 - person Jesse Wilson; 07.04.2019