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