Изменения в использовании SSLEngine при переходе на TLSv1.3 - PullRequest
0 голосов
/ 14 февраля 2019

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.

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

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

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

0 голосов
/ 17 февраля 2019

Это правда, что нет явной ссылки на влияние 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 будет отправлено соответствующее close_notify alert, и соединение будет двусторонне закрыто.

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 : " Протокол безопасности транспортного уровня (TLS) версии 1.3"(стр.138-141).
  • Краткое видео о совместимости между TLS 1.3 и более ранними выпусками в этом видео Oracle " Технические сессии в понедельник: Moscone West 2004 " между 2: 53: 37 и 2: 56: 35.
...