Я работаю над 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)?
Спасибо заранее!
Да, конечно! Я могу связать второй запрос с первым запросом, потому что сообщения используют одно и то же соединение сокета. Я не могу поверить, что раньше не думал об этом. Еще раз спасибо EJP! – Peter