Странное поведение режима Netty SSL

Я пытаюсь понять, почему режим Netty SSL работает странным образом? Кроме того, проблема заключается в следующем: когда любой SSL-клиент (https-браузер, java-клиент, использующий ssl, а также любое клиентское приложение ssl) подключается к серверу Netty, я получаю в начале полное сообщение, где я могу правильно распознать используемый протокол, но пока канал остается подключенным, любые последующие сообщения имеют странную структуру, чего не происходит в режиме без ssl. В качестве примера метода messageReceived, когда браузер https подключается к моему серверу:

Я использовал PortUnificationServerHandler для переключения протоколов.. (без использования обработчика http nettys, это просто пример, потому что я также использую режим ssl для своего собственного протокола)

  1. первое сообщение в порядке, я получаю полный заголовок, начинающийся с GET или POST
  2. чем я посылаю ответ...
  3. второе сообщение имеет длину всего один байт и содержит только «G» или «P».
  4. третье сообщение больше, чем остальные, начинающиеся либо с ET, либо с OST, а остальная часть заголовка и тела http.
  5. вот опять следует мой ответ...
  6. четвертое сообщение снова имеет длину один байт и снова содержит только один байт.
  7. пятое сообщение опять остальное... и так игра идет дальше..

здесь не важно, какой подпротокол используется, http или любой другой, после первого сообщения я получаю сначала один байт, а во втором сообщении остальную часть запроса.

Я хотел создать некоторое искусство прокси, получить данные ssl и отправить их в незакодированном виде другому слушателю, но когда я делаю это напрямую, не дожидаясь полного запроса данных, целевой слушатель (например, http-сервер) не может обрабатывать такие данные, если цель получает только один байт как первый (даже если следующее сообщение содержит остальные), канал немедленно закрывается и запрос отбрасывается.. Хорошо, сначала нужно сделать следующее, временно кэшировать первый байт и дождаться следующего сообщения и чем присоединиться к этим сообщениям и только чем ответить, это работает нормально, но иногда это неправильный подход, потому что один байт иногда действительно является последним байтом сообщения, и если я кэширую его и ошибочно жду следующего сообщения, я могу ждать вечно, потому что браузер https ожидает в это время какого-то ответа и больше не отправляет никаких данных.

Теперь вопрос, возможно ли решить эту проблему с помощью SSL? Может есть какие-то специальные настройки, влияющие на такое поведение? Я хочу полностью объединенное сообщение сразу как есть, а не сначала первый байт, а затем остальные.. Не могли бы вы подтвердить, что с более новыми версиями Netty вы ведете себя так же, используя PortUnificationServerHandler (но без обработчика netty http, попробуйте какой-нибудь собственный обработчик.) Это поведение нормально, я не верю, оно было спроектировано так, чтобы работать.


person user1466331    schedule 26.10.2012    source источник


Ответы (2)


То, что вы испытываете, вероятно, связано с мерами противодействия атаке BEAST.

Это не проблема. Проблема заключается в том, что вы предполагаете, что вы должны читать данные в виде сообщений/пакетов. Это не так: TCP (и TLS/SSL) предназначены для использования в качестве потоков непрерывных данных. Вы должны продолжать читать данные, пока они доступны. Где разделить входящие данные, где это имеет смысл, определяется протоколом приложения. Для HTTP показаниями являются пустая строка после заголовка и кодировка Content-Length или фрагментированная передача для объекта.

Если вы определяете свой собственный протокол, вам понадобится аналогичный механизм, независимо от того, используете ли вы обычный HTTP или SSL/TLS. Предполагая, что вам это не нужно, это работает только случайно.

person Bruno    schedule 08.04.2013

Я столкнулся с этой проблемой и обнаружил, что она была вызвана использованием JDK1.7. Возвращение к JDK1.6 решило эту проблему. У меня не было времени на дальнейшие исследования, но сейчас я предположил, что реализация SSLEngine изменилась в JDK. Я буду исследовать дальше, когда время позволит.

person f2stoke    schedule 08.04.2013