Управление сессиями SSL с помощью JSSE SSLEngine - PullRequest
1 голос
/ 13 марта 2012

Я работаю на веб-сервере 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)?

Заранее спасибо!

1 Ответ

3 голосов
/ 14 марта 2012

Вы должны создать новый SSLEngine за SocketChannel, а не за запрос, или за страницу, или за приложение. SSLEngine знает только о состоянии одного SSL-соединения за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...