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;
  • GnuTLS, начиная с версии 3.2.0 (выпущена в мае 2013 года)[1];
  • MatrixSSL, начиная с версии 3.7.1 (выпущена в декабре 2014 года)[2];
  • Network Security Services, начиная с версии 3.15.5 (выпущена в апреле 2014 года)[3];
  • OpenSSL с версии 1.0.2 (выпущена в январе 2015 года);
  • LibreSSL с версии 2.1.3 (выпущена в январе 2015 года)[4];
  • mbed TLS (ранее эта библиотека называлась PolarSSL), начиная с версии 1.3.6 (выпущена в апреле 2014 года)[5];
  • s2n с первой версии (выпущена в июне 2015 года);
  • wolfSSL (прежнее название — CyaSSL) с версии 3.7.0 (выпущена в октябре 2015 года);
  • пакет crypto/tls стандартной библиотеки языка программирования Go, начиная с версии 1.4 (вышедшей в декабре 2014 года)[6];
  • расширение JSSE в Java, начиная с JDK 9 (выпущен в сентябре 2017 года)[7] и начиная с JDK 8, вышедшей в апреле 2020 года[8];
  • Win32 SSPI, начиная с Windows 8.1 и Windows Server 2012 R2, выпущенных 18 октября 2013 года[9].

История

Next Protocol Negotiation

В январе 2010 года компания Google представила проект стандарта IETF, описывающий расширение Next Protocol Negotiation для протокола TLS[10]. Это расширение использовалось для согласования экспериментальных соединений SPDY между Google Chrome и некоторыми серверами Google. По мере развития SPDY расширение NPN было заменено на ALPN.

Согласование протокола прикладного уровня (ALPN)

11 июля 2014 года был опубликован RFC 7301, определяющий ALPN как замену расширения Google Next Protocol Negotiation (NPN)[11].

В 2012 году в версии 20 браузера Google Chrome был отключён TLS False Start, за исключением веб-сайтов, поддерживавших более раннее расширение NPN[12].

Пример

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

Примечания

  1. gnutls 3.2.0 (англ.). Дата обращения: 26 января 2015. Архивировано 31 января 2016 года.
  2. MatrixSSL - News (англ.) (4 декабря 2014). Дата обращения: 26 января 2015. Архивировано 14 февраля 2015 года.
  3. NSS 3.15.5 release notes (англ.). Mozilla Developer Network. Mozilla. Дата обращения: 26 января 2015. Архивировано 10 февраля 2015 года.
  4. LibreSSL 2.1.3 released (англ.) (22 января 2015). Дата обращения: 26 января 2015. Архивировано 31 января 2016 года.
  5. Download overview - PolarSSL (англ.) (11 апреля 2014). Дата обращения: 26 января 2015. Архивировано 9 февраля 2015 года.
  6. Go 1.4 Release Notes (англ.) (10 декабря 2014). Дата обращения: 28 ноября 2017. Архивировано 16 сентября 2020 года.
  7. JEP 244: TLS Application-Layer Protocol Negotiation Extension (англ.) (7 августа 2017). Дата обращения: 29 августа 2018. Архивировано 21 октября 2020 года.
  8. Release Note: TLS Application-Layer Protocol Negotiation Extension (англ.) (30 апреля 2020). Дата обращения: 11 июня 2020. Архивировано 7 августа 2020 года.
  9. What's New in TLS/SSL (Schannel SSP) (англ.). Дата обращения: 30 марта 2020. Архивировано 14 сентября 2020 года.
  10. A. Langley. Transport Layer Security (TLS) Next Protocol Negotiation Extension (англ.). IETF Datatracker (20 января 2010). Дата обращения: 12 января 2023. Архивировано 12 января 2023 года.
  11. A. Langley. NPN and ALPN (англ.). ImperialViolet (20 марта 2013). Дата обращения: 8 августа 2013. Архивировано 8 августа 2013 года.
  12. A. Langley. False Start's Failure (англ.). ImperialViolet (11 апреля 2012). Дата обращения: 12 сентября 2013. Архивировано 12 сентября 2013 года.

Литература