Изменения в использовании SSLEngine при переходе на TLSv1.3

Java 11 была выпущена с TLSv1.3 поддержка, используемая по умолчанию.

Он работает нормально в контексте сокетов HTTPS и SSL, но кажется, что при использовании SSLEngine Есть дополнительные препятствия из-за изменений в TLSv1.3 поведение.

Таким образом, существует надежная реализация связи через NIO с помощью SSLEngine это больше не работает, когда TLSv1.3 включен. Нет явных ошибок, в виде исключений или ошибок SSL, два узла будут просто отправлять сообщения о переносе / развёртывании назад и вперед и, в конечном итоге, превышать время ожидания.

Меня интересует точный список изменений поведения между SSLEngine с использованием TLSv1.2 и SSLEngine с использованием TLSv1.3 и, если возможно, контрольный список миграции между ними. К сожалению, javadocs SSLEngine Java 11 не имеет этой информации - нет новых методов в Java 11 и нет ссылки на TLSv1.3.

1 ответ

Это правда, что нет явной ссылки на влияние TLS 1.3 на SSLEngine в его Javadoc в JDK 11, и не было никаких изменений в его методах.

Однако пятый пункт (закрытие) в списке этапов SSLEngine был обновлен в общем описании в начале его Javadoc в JDK 11:

Закрытие. Когда соединение больше не требуется, клиентское и серверное приложения должны закрывать обе стороны соответствующих соединений. За SSLEngine объекты, приложение должно вызывать closeOutbound() и отправлять любые оставшиеся сообщения на одноранговый узел. Аналогично, приложение должно получать любые оставшиеся сообщения от партнера до вызова closeInbound(), Основной транспортный механизм затем может быть закрыт после обеих сторон SSLEngine были закрыты. Если соединение не закрыто упорядоченным образом (например, closeInbound() вызывается до того, как будет получено уведомление о закрытии записи однорангового узла), будут возникать исключения, указывающие на то, что произошла ошибка. Когда двигатель закрыт, его нельзя использовать повторно: новый SSLEngine должен быть создан.

Это изменение также обсуждается в примечаниях к выпуску Oracle для JDK 11:

Политика TLS 1.3 с половинным закрытием
Новое свойство системы, jdk.tls.acknowledgeCloseNotify, был добавлен. Значением по умолчанию системного свойства является false. Если системное свойство имеет значение true, соответствующий close_notify alert будет отправлено при получении close_notify оповещение, и соединение будет дуплексным.

TLS 1.2 и более ранние версии используют политику дуплексного закрытия, в то время как TLS 1.3 использует политику полузакрытия. Входящие и исходящие оповещения close_notify для TLS 1.3 являются независимыми. При обновлении до TLS 1.3 может произойти непредвиденное поведение, если ваше приложение отключит (D) соединение TLS, используя только один из SSLEngine.closeInbound() или же SSLEngine.closeOutbound() API, но не оба на каждой стороне соединения. Если ваше приложение обнаруживает неожиданные зависания или тайм-ауты, когда базовая (D) транспортировка TLS не закрыта дуплексом, вам может потребоваться установить для этого свойства значение true.

Обратите внимание, что когда соединение TLS/DTLS больше не требуется, клиентское и серверное приложения должны закрывать обе стороны соответствующего соединения.

Итак, постановка jdk.tls.acknowledgeCloseNotify Значение true может решить вашу конкретную проблему с таймаутами при использовании SSlEngine с TLS 1.3:

Если ваше приложение обнаруживает неожиданные зависания или тайм-ауты, когда базовая (D) транспортировка TLS не закрыта дуплексом, вам может потребоваться установить для этого свойства значение true.

В документе "Примечания к выпуску" также содержится ссылка на закрытую ошибку JDK JDK-8208526: неполное закрытие TLS 1.3 и проблемы с синхронизацией, в которых обсуждаются изменения еще более подробно.

Связанная (и закрытая) ошибка JDK-8207009: неполное закрытие TLS 1.3 и проблемы синхронизации также могут представлять интерес.

Другие ссылки:

  • См. " Приложение D. Обратная совместимость " RFC 8446: " Версия 1.3 протокола безопасности транспортного уровня (TLS) " (стр. 138-141).
  • Краткое видео о совместимости между TLS 1.3 и более ранними выпусками в этом видео Oracle " Технические сессии в понедельник: Moscone West 2004 " между 2:53:37 и 2:56:35.

В конце концов, нам нужно было прочитать оставшиеся данные из буфера после завершения рукопожатия, развернуть их и обновить статус рукопожатия. Похоже на крайний случай, с которым мы раньше не сталкивались.

Соответствующая фиксация: IGNITE-11298 Исправления для поддержки TLSv1.3 в коммуникации

Другие вопросы по тегам