Запретить повторное рукопожатие SSL в Java (JSSE)?

Есть ли способ запретить повторное рукопожатие в библиотеках SSL Java на стороне клиента и сервера?

Я уже искал Javadocs SSLContext, SSLParameters, SSLSocket, SSLServerSocket и их соответствующие фабрики, но не нашел решения.


person MinecraftShamrock    schedule 18.08.2014    source источник


Ответы (2)


Я не знаю (простого) хорошего решения, но я нашел плохое.

Оказывается, в 2009 году в протоколе SSL была обнаружена уязвимость, которая влияла на повторное согласование SSL (или повторное рукопожатие). Команда Java решила эту проблему в два этапа (как описано здесь.). Первый этап заключался в отключении повторного согласования... и это было сделано в патче 19 для Java 6. Второй этап заключался в реализации изменений протокола для повторного согласования, указанных в новом RFC.

Таким образом, одним из способов отключить повторное согласование SSL будет понижение версии JVM до Java 6 patch 19.

Честно говоря, я думаю, что это действительно плохая идея:

  • Вы возвращаетесь к версии Java, которая была EOL'd.
  • Вы отказываетесь от целой стопки исправлений безопасности.
  • Если вы начали использовать функции языка/библиотеки Java 7 или Java 8, вам предстоит дополнительная работа.

Однако, если это выкапывает вас из действительно глубокой ямы, вы можете подумать об этом.


Что ж, я посмотрел исходный код SSLEngineImpl (здесь), и я не вижу прямого решения, основанного на этом. Найдите метод kickstartHandshake.

Есть пара свойств, которые включают/отключают небезопасные формы повторного согласования (для совместимости), но нет свойств, чтобы отключить его полностью. И поскольку всю работу выполняет метод private, я не думаю, что вы могли бы отключить функцию повторного согласования, переопределив методы в подклассе.

Так что, вероятно, вам остается скопировать код, изменить его, чтобы отключить повторное согласование, изменить имена пакетов и создать альтернативный «поставщик» механизма SSL.

И чтобы еще больше все запутать... есть еще одна реализация протокола SSL в классе SSLSocketImpl (здесь). Я не пытался выяснить, какая из двух реализаций является той, что вы получаете «по умолчанию».

person Stephen C    schedule 18.08.2014
comment
Спасибо за попытку. Это не критично, пока я могу продолжать отправлять данные во время повторного рукопожатия. Возможно ли это в Java? - person MinecraftShamrock; 18.08.2014
comment
Извините, я не знаю. Но я дал ссылку на исходный код (оба варианта), чтобы вы могли копать самостоятельно. - person Stephen C; 18.08.2014
comment
Спасибо за все усилия. Буду копать дальше сам :D - person MinecraftShamrock; 18.08.2014
comment
@StephenC Вы знаете, где я могу найти реализованный механизм SSL со всеми функциями? - person user1285928; 17.10.2015

Чтобы ответить на ваш настоящий вопрос, который появляется в комментарии к другому ответу, да, вы можете продолжить отправку данных во время повторного рукопожатия.

person user207421    schedule 19.08.2014