ALPN (ALPN)
ALPN (англ. Application-Layer Protocol Negotiation — согласование протокола прикладного уровня) — расширение протокола TLS, которое позволяет на прикладном уровне модели OSI согласовать протокол безопасного соединения, что позволяет избежать дополнительных циклов и который не зависит от целевого протокола прикладного уровня. ALPN используется для установления соединений HTTP/2 без дополнительных циклов согласования протокола обмена данными (клиент и сервер могут обмениваться данными HTTP/2 через порты, назначенные для HTTPS с HTTP/1.1, или продолжать использовать HTTP/1.1, не создавая новое соединение и не закрывая исходное).
Поддержка ALPN в ПО
[править | править код]ALPN поддерживают следующие библиотеки:
- BSAFE Micro Edition Suite[англ.], начиная с версии 5.0[1];
- GnuTLS, начиная с версии 3.2.0 (выпущена в мае 2013)[2];
- MatrixSSL[англ.] начиная с версии 3.7.1 (выпущена в декабре 2014)[3];
- Network Security Services, начиная с версии 3.15.5 (выпущена в апреле 2014)[4];
- OpenSSL с версии 1.0.2 (выпущена в январе 2015)[5];
- LibreSSL с версии 2.1.3 (выпущена в январе 2015)[6];
- mbed TLS[англ.] (ранее называлась PolarSSL), начиная с версии 1.3.6, (выпущена в апреле 2014)[7];
- s2n[англ.] с первой версии (выпущена в июне 2015 года);
- wolfSSL (прежнее название — CyaSSL) с версии 3.7.0 (выпущена в октябре 2015)[8];
- пакет crypto/tls стандартной библиотеки языка программирования Go версий 1.4 и новее (вышедшей в декабре 2014)[9];
- расширение JSSE в Java, начиная с JDK 9 (вышел в сентябре 2017)[10] и в версии JDK 8, вышедшей в апреле 2020[11];
- Win32 SSPI, начиная с Windows 8.1 и Windows Server 2012 R2, вышедших 18 октября 2013[12].
История
[править | править код]Next Protocol Negotiation
[править | править код]В январе 2010 года компания Google представила проект стандарта IETF, описывающий расширение Next Protocol Negotiation для протокола TLS[13]. Это расширение использовалось для согласования экспериментальных соединений SPDY между Google Chrome и некоторыми серверами Google. По мере развития SPDY NPN был заменен на ALPN.
Application-Layer Protocol Negotiation
[править | править код]11 июля 2014 года был опубликован RFC 7301, описывающий ALPN как замену расширения Google Next Protocol Negotiation (NPN)[14].
В 2012 году в версии 20 браузера Google Chrome был отключен TLS False Start, за исключением веб-сайтов с более ранним расширением NPN[15].
Пример
[править | править код]ALPN — это расширение TLS, которое отправляется в процессе начального «рукопожатия» TLS (Client Hello).
Пример запроса Client Hello с использованием ALPN (начального «рукопожатия» TLS), в котором перечислены протоколы, поддерживаемые клиентом (клиент, например, является веб-браузером)
Handshake Type: Client Hello (1) Length: 141 Version: TLS 1.2 (0x0303) Random: dd67b5943e5efd0740519f38071008b59efbd68ab3114587... Session ID Length: 0 Cipher Suites Length: 10 Cipher Suites (5 suites) Compression Methods Length: 1 Compression Methods (1 method) Extensions Length: 90 [other extensions omitted] Extension: application_layer_protocol_negotiation (len=14) Type: application_layer_protocol_negotiation (16) Length: 14 ALPN Extension Length: 12 ALPN Protocol ALPN string length: 2 ALPN Next Protocol: h2 ALPN string length: 8 ALPN Next Protocol: http/1.1
Ответный Server Hello, полученный от веб-сервера, также содержащий расширение ALPN — в нём сервер подтверждает, какой протокол будет использоваться в последующих запросах HTTP:
Handshake Type: Server Hello (2) Length: 94 Version: TLS 1.2 (0x0303) Random: 44e447964d7e8a7d3b404c4748423f02345241dcc9c7e332... Session ID Length: 32 Session ID: 7667476d1d698d0a90caa1d9a449be814b89a0b52f470e2d... Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) Compression Method: null (0) Extensions Length: 22 [other extensions omitted] Extension: application_layer_protocol_negotiation (len=5) Type: application_layer_protocol_negotiation (16) Length: 5 ALPN Extension Length: 3 ALPN Protocol ALPN string length: 2 ALPN Next Protocol: h2
Примечания
[править | править код]- ↑ Dell BSAFE Micro Edition Suite 5.0 Release Advisory (англ.). Дата обращения: 18 октября 2022.
- ↑ gnutls 3.2.0 (англ.). Дата обращения: 26 января 2015. Архивировано из оригинала 31 января 2016 года.
- ↑ MatrixSSL - News (англ.) (4 декабря 2014). Дата обращения: 26 января 2015. Архивировано из оригинала 14 февраля 2015 года.
- ↑ NSS 3.15.5 release notes (англ.). Mozilla Developer Network. Mozilla. Дата обращения: 26 января 2015. Архивировано 10 февраля 2015 года.
- ↑ OpenSSL 1.0.2 release notes (англ.). The OpenSSL Project. The OpenSSL Project (22 января 2015). Дата обращения: 26 января 2015. Архивировано из оригинала 4 сентября 2014 года.
- ↑ LibreSSL 2.1.3 released (англ.) (22 января 2015). Дата обращения: 26 января 2015. Архивировано 31 января 2016 года.
- ↑ Download overview - PolarSSL (англ.) (11 апреля 2014). Дата обращения: 26 января 2015. Архивировано 9 февраля 2015 года.
- ↑ wolfSSL Release Change Log (англ.) (26 октября 2015). Дата обращения: 11 сентября 2015. Архивировано 16 марта 2016 года.
- ↑ Go 1.4 Release Notes (англ.) (10 декабря 2014). Дата обращения: 28 ноября 2017. Архивировано 16 сентября 2020 года.
- ↑ JEP 244: TLS Application-Layer Protocol Negotiation Extension (англ.) (7 августа 2017). Дата обращения: 29 августа 2018. Архивировано 21 октября 2020 года.
- ↑ Release Note: TLS Application-Layer Protocol Negotiation Extension (англ.) (30 апреля 2020). Дата обращения: 11 июня 2020. Архивировано 7 августа 2020 года.
- ↑ What's New in TLS/SSL (Schannel SSP) (англ.). Дата обращения: 30 марта 2020. Архивировано 14 сентября 2020 года.
- ↑ Langley, A. Transport Layer Security (TLS) Next Protocol Negotiation Extension : [англ.] : [арх. 12 января 2023] // IETF Datatracker. — 2010. — 20 January.
- ↑ Langley, A. NPN and ALPN : [англ.] : [арх. 8 августа 2013] // ImperialViolet. — 2013. — 20 March.
- ↑ Langley, A. False Start's Failure : [англ.] : [арх. 12 сентября 2013] // ImperialViolet. — 2012. — 11 April.
Литература
[править | править код]- TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs / Experts: Yoav Nir, Rich Salz, Nick Sullivan // Transport Layer Security (TLS) Extensions : [англ.]. — IANA, 2005.
- Langley, A. Transport Layer Security (TLS) Next Protocol Negotiation Extension : draft-agl-tls-nextprotoneg-04 : [англ.] : Internet-Draft / Google Inc; IETF Network Working Group. — IETF, 2012. — May.
- RFC 7301 : Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension
- Application Layer Protocol Negotiation : TLS extension for application layer protocol negotiation within the TLS handshake : [англ.] : [арх. 12 января 2023] / HTTPBis WG (Stephan Friedl, Andrei Popov, Adam Langley, Emile Stephan). — IETF HTTP Working Group. — 11 p.