openjdk.ruOpenJDK на русском

JEP 244: TLS Application-Layer Protocol Negotiation Extension

Расширение TLS для согласования протокола прикладного уровня

АвторVincent Ryan
ОтветственныйBradford Wetmore
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск9
Компонентsecurity-libs / javax.net.ssl
Обсуждениеsecurity dash dev at openjdk dot java dot net
ТрудоёмкостьS
Зависит от8144093: JEP 244/8051498 - TLS Application-Layer Protocol Negotiation Extension
Связан сJEP 110: HTTP/2 Client (Incubator)
8230977: JEP 244: TLS Application-Layer Protocol Negotiation Extension (Java SE 8)
РецензентыBrian Goetz, Sean Mullan
ОдобренBrian Goetz
Создан2014/01/08 14:49
Обновлён2022/08/10 21:16
Задача8051498

Аннотация

Расширить пакет javax.net.ssl для поддержки Application Layer Protocol Negotiation (ALPN) Extension (расширение TLS для согласования протокола прикладного уровня), с помощью которого можно согласовать прикладной протокол для TLS-соединения.

Мотивация

Некоторые TLS-клиенты и серверы хотят использовать несколько протоколов прикладного уровня через один и тот же порт транспортного уровня. Для этого расширение ALPN позволяет клиенту передать список поддерживаемых им протоколов прикладного уровня в порядке предпочтения. Затем сервер может выбрать один из предложенных клиентом протоколов и сообщить клиенту, какой протокол будет использоваться в TLS-соединении.

Одним из важных потребителей этого расширения TLS будет HTTP/2-клиент (JEP 110), реализующий HTTP/2.

Описание

Эта возможность определяет публичный API для согласования протоколов прикладного уровня, которые можно передавать через конкретное TLS-соединение. Клиент и сервер передают друг другу названия протоколов во время начального TLS-рукопожатия.

TLS-приложение может использовать расширенный класс SSLParameters, чтобы получать и задавать список протоколов прикладного уровня, которые оно может поддерживать в конкретном соединении. Реализация TLS тоже использует этот класс, чтобы получить названия протоколов, объявленные приложением.

По умолчанию из пересечения включённых значений прикладных протоколов выбирается значение, наиболее предпочтительное для сервера.

Серверные приложения также могут самостоятельно просматривать начальные сообщения ClientHello, передаваемые открытым текстом, чтобы выбрать подходящее значение протокола ALPN для данного соединения. Решение может приниматься на основе предложенных протоколов TLS, наборов шифров, значений Server Name Indication и т. д. Затем серверное приложение может:

  • выбрать один из предложенных протоколов, если оно будет его поддерживать,
  • решить, что значения ALPN, предложенные удалённой стороной и поддерживаемые локально, не пересекаются, или
  • полностью проигнорировать расширение.

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

После начала SSL/TLS-рукопожатия приложение может с помощью новых методов SSLSocket/SSLEngine узнать, выбрано ли уже значение ALPN (getHandshakeApplicationProtocol()).
После завершения TLS-рукопожатия приложение может узнать, какой протокол был согласован, с помощью метода getApplicationProtocol().

Предлагаемый дизайн следует подходу к API, похожему на тот, что использован для Server Name Indication Extension (JEP 114), появившегося в JDK 8, но отличается тем, что значения ALPN привязаны к соединению, а не к SSLSession.

Тестирование

  • Клиентские реализации должны работать с веб-серверами, поддерживающими HTTP/2 и SPDY (например, Apache/mod_spdy, Jetty и, возможно, другими). SPDY теряет значение, поскольку HTTP/2 стал его широко известной заменой. Реализации SPDY, по всей видимости, очень скоро станут редкостью. Мы обязательно проведём тестирование с новым HTTP/2-клиентом из JEP 110.
  • Серверные реализации следует протестировать с известными реализациями TLS-клиентов, умеющими использовать ALPN (например, GnuTLS, NSS, OpenSSL(beta) и Microsoft SChannel 8.1). Пока мы не планируем добавлять серверные приложения с поддержкой ALPN. В основном тестирование здесь сведётся к простым TLS-рукопожатиям и проверке согласованных значений.