Я работаю на веб-сервере SSL, используя NIO и SSLEngine .Я могу успешно обрабатывать рукопожатия и отправлять / получать данные приложения.Однако мне трудно понять, как поддерживать состояние сеанса SSL.
Я использую Firefox 10 для тестирования своего веб-сервера.На начальной загрузке страницы все отлично работает.Рукопожатие успешно завершено.Сервер обрабатывает запрос клиента и отправляет ответ.Ответ встречается чисто, и браузер загружает данные приложения (HTML, изображения и т. Д.).Вот снимок сообщений, отправленных клиентом на сервер.
Запрос страницы # 1
===============================================
== Message 1
===============================================
Client Request:
handshake (22)
- client_hello (1)
Server Response:
handshake (22)
- server_hello (2)
- certificate (11)
- server_key_exchange (12)
- certificate_request (13)
- server_hello_done (14)
===============================================
== Message 2
===============================================
Client Request:
handshake (22)
- certificate (11)
- client_key_exchange (16)
change_cipher_spec (20)
- client_hello (1)
handshake (22)
*** Encrypted Message ****
===============================================
== Message 3
===============================================
Client Request:
application_data (23)
*** Encrypted Message ****
application_data (23)
*** Encrypted Message ****
Server Response:
application_data (23)
*** Encrypted Message ****
Опять же, при начальной загрузке страницы все прекрасно работает,Однако, если я обновляю браузер или перехожу на другую «страницу», Firefox отправляет запись приложения вместо приветствия клиента.
Запрос страницы # 2
===============================================
== Application Data
===============================================
Client Request:
application_data (23)
*** Encrypted Message ****
В этом случае SSLEngine выдает исключение при попытке развернуть данные приложения.
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Я полагаю, что это потому, что я создаю новый SSLEngine с каждым запросом страницы.Если я создаю экземпляр SSLEngine только один раз и превращаю его в глобальную / статическую переменную, он успешно разворачивает запись приложения, и я могу отправить ответ клиенту.Я могу обновить страницу, посетить другие страницы и т. Д. Без проблем.Загрузка страниц происходит очень быстро, потому что мы пропускаем весь процесс рукопожатия ssl.
К сожалению, если я подключаюсь к веб-серверу из другого браузера, когда все это происходит (например, IE или Safari), состояние сеанса внутри SSLEngine исчезает, и мой веб-сервер не может отвечать ни на какие новыеЗапросы SSL.Так что создание экземпляра SSLEngine и превращение его в глобально доступную статическую переменную не представляется приемлемым вариантом.Итак ...
Как же мне ответить на второй запрос страницы (Запрос страницы № 2)?Есть ли какой-нибудь способ связать запрос второй страницы (запрос страницы № 2) с первоначальным запросом рукопожатия (запрос страницы № 1), кроме IP-адреса?Есть ли идентификатор сеанса SSL, скрытый в данных приложения во втором запросе страницы (запрос страницы № 2)?
Заранее спасибо!