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.
Надеюсь, это помогло! Удачи!