2012-03-13 4 views
1

Я работаю над SSL web server using NIO and the SSLEngine. Я могу успешно обрабатывать рукопожатия и отправлять/получать данные приложения. Однако мне трудно понять, как поддерживать состояние сеанса SSL.Управление сеансом SSL с JSSE SSLEngine

Я использую Firefox 10 для проверки своего веб-сервера. На начальной загрузке страницы все отлично работает. Квитирование завершено успешно. Сервер обрабатывает запрос клиента и отправляет ответ. Ответ наступает чисто, и браузер загружает данные приложения (html, images и т. Д.). Вот моментальный снимок сообщений, отправленных с клиента на сервер.

Страница запроса # 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 отправляет запись приложения вместо приветствия клиента.

Page Запрос # 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)?

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

ответ

3

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

+0

Да, конечно! Я могу связать второй запрос с первым запросом, потому что сообщения используют одно и то же соединение сокета. Я не могу поверить, что раньше не думал об этом. Еще раз спасибо EJP! – Peter