HttpsURLConnection: возобновление SSL не работает

Я пытаюсь настроить SSL (с возобновлением SSL) с помощью HttpsURLConnection с моим собственным менеджером доверия.

Я могу выполнять только рукопожатия ssl и соединения. Нет возобновления SSL. Предыдущие сеансы никогда не используются повторно.

Я искал все, но не повезло. Все ответы относятся к HttpClient (это не вариант).

Моя настройка выглядит следующим образом:

  • Я создаю контекст SSL, который я храню для последующего использования.

  • Затем я создаю SSL Factory, используя этот контекст SSL, который я также сохраняю для его использования со всеми подключениями.

  • Я запускаю соединение, где все идет хорошо: Я получаю sessionID, выполняется полное рукопожатие, и соединение отправляется на сервер.

  • Через минуту я начинаю другое соединение. По какой-то странной причине это соединение не отправляет sessionID ранее. Я печатаю сеанс SSLContext - последний сеанс все еще существует и действителен. По какой-то причине это новое соединение не использует его, поэтому создается еще один сеанс и добавляется в кеш сеансов.

Я пробовал как версию Android 2.3, так и 4.1 на двух разных устройствах.

После многих результатов Google я даже попытался добавить Keep-Alive, как предлагали некоторые пользователи, а также другие вуду, которые не привели к разным результатам.

Кто-нибудь сталкивался с этим? Что-то мне не хватает?

Что может заставить мои подключения не использовать последний сеанс?

Спасибо заранее!

Ответы

Ответ 1

Что бы вы хотели сделать, используйте reflection, чтобы переопределить членов класса android.net.SSLCertificateSocketFactory, члены:

  • HOSTNAME_VERIFIER
  • mTrustManagers
  • mKeyManagers

Сделайте это, получив класс:

Class<?> sslClass = Class.forName("android.net.SSLCertificateSocketFactory");
Field classField = sslClass.getDeclaredField("defaultTrustManager");
classField.setAccessible(true);
classField.set(null /*If Feild is static*/, youObjectHere /*Needs casting*/);
classField.set(objectInstance /*If Feild is not static*/, youObjectHere /*Needs casting*/);

а затем:

Переопределите их с помощью собственных переменных. Это позволит возобновить SSL для Android API 14 и выше (я тестировал 14).

BEWARE

Вам нужно будет поддерживать этот код и следить за любыми изменениями, которые может сделать Google.

Надеюсь, это помогло! Удачи!