ALPN (англ. Application-Layer Protocol Negotiation — согласование протокола прикладного уровня) — расширение протокола TLS, которое позволяет на прикладном уровне модели OSI согласовать протокол безопасного соединения, что позволяет избежать дополнительных циклов и который не зависит от целевого протокола прикладного уровня. ALPN используется для установления соединений HTTP/2 без дополнительных циклов согласования протокола обмена данными (клиент и сервер могут обмениваться данными HTTP/2 через порты, назначенные для HTTPS с HTTP/1.1, или продолжать использовать HTTP/1.1, не создавая новое соединение и не закрывая исходное).
ALPN поддерживают следующие библиотеки:
В январе 2010 года компания Google представила проект стандарта IETF, описывающий расширение Next Protocol Negotiation для протокола TLS[13]. Это расширение использовалось для согласования экспериментальных соединений SPDY между Google Chrome и некоторыми серверами Google. По мере развития SPDY NPN был заменен на ALPN.
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