Есть ли способ запретить повторное рукопожатие в библиотеках SSL Java на стороне клиента и сервера?
Я уже искал Javadocs SSLContext, SSLParameters, SSLSocket, SSLServerSocket и их соответствующие фабрики, но не нашел решения.
Есть ли способ запретить повторное рукопожатие в библиотеках SSL Java на стороне клиента и сервера?
Я уже искал Javadocs SSLContext, SSLParameters, SSLSocket, SSLServerSocket и их соответствующие фабрики, но не нашел решения.
Я не знаю (простого) хорошего решения, но я нашел плохое.
Оказывается, в 2009 году в протоколе SSL была обнаружена уязвимость, которая влияла на повторное согласование SSL (или повторное рукопожатие). Команда Java решила эту проблему в два этапа (как описано здесь.). Первый этап заключался в отключении повторного согласования... и это было сделано в патче 19 для Java 6. Второй этап заключался в реализации изменений протокола для повторного согласования, указанных в новом RFC.
Таким образом, одним из способов отключить повторное согласование SSL будет понижение версии JVM до Java 6 patch 19.
Честно говоря, я думаю, что это действительно плохая идея:
Однако, если это выкапывает вас из действительно глубокой ямы, вы можете подумать об этом.
Что ж, я посмотрел исходный код SSLEngineImpl
(здесь), и я не вижу прямого решения, основанного на этом. Найдите метод kickstartHandshake
.
Есть пара свойств, которые включают/отключают небезопасные формы повторного согласования (для совместимости), но нет свойств, чтобы отключить его полностью. И поскольку всю работу выполняет метод private
, я не думаю, что вы могли бы отключить функцию повторного согласования, переопределив методы в подклассе.
Так что, вероятно, вам остается скопировать код, изменить его, чтобы отключить повторное согласование, изменить имена пакетов и создать альтернативный «поставщик» механизма SSL.
И чтобы еще больше все запутать... есть еще одна реализация протокола SSL в классе SSLSocketImpl
(здесь). Я не пытался выяснить, какая из двух реализаций является той, что вы получаете «по умолчанию».
Чтобы ответить на ваш настоящий вопрос, который появляется в комментарии к другому ответу, да, вы можете продолжить отправку данных во время повторного рукопожатия.