8.1.2 Что такое ALPN и для чего он необходим
ALPN (сокр. Application-Layer Protocol Negotiation) – это расширение Transport Layer Security (TLS), позволяющее на прикладном сетевом уровне согласовывать какой протокол следует использовать через защищенное соединение, таким образом, избегая дополнительных двусторонних запросов. Одновременно с этим ALPN не зависит от других протоколов прикладного уровня.
ALPN был описан в RFC 7301 и является прямой эволюцией NPN (Next Protocol Negotiation), разработанным Google для использования в их экспериментальном протоколе SPDY.
На практике, ALPN в первую очередь нужно для безопасных соединений по протоколу HTTP/2, что улучшает сжатие веб-страниц и уменьшает их задержку по сравнению с предыдущим поколением HTTP/1.1 и HTTP/1.0. Без наличия на сервере библиотеки поддерживающей ALPN работа по протоколу HTTP/2 невозможна.
Детально: как на пратике работает ALPN
В начале процесса установки безопасного соединения между клиентом и сервером происходит процесс TLS Handshake. В ходе этого процесса клиент и сервер договариваются о параметрах шифрования, аутентификации и других настроек безопасности.
Первым шагом в TLS Handshake является отправка сообщения ClientHello
от клиента к серверу. ClientHello
включает в себя список поддерживаемых протоколов прикладного уровня, включая те, которые поддерживает ALPN. Сервер отвечает сообщением ServerHello
, которое содержит выбранные параметры соединения, включая протоколы прикладного уровня.
Если сервер и клиент поддерживают ALPN, клиент включает в ClientHello
расширение ALPN с перечислением поддерживаемых протоколов прикладного уровня, таких как HTTP/1.1, HTTP/2 и т. д. Сервер может либо выбрать один из предложенных протоколов, либо выбрать альтернативный протокол.
Сервер анализирует предложенные клиентом протоколы прикладного уровня и выбирает наиболее подходящий протокол. Он может выбрать протокол, который наиболее эффективно поддерживается сервером и клиентом, например, HTTP/2 вместо HTTP/1.1, что улучшит скорость и производительность соединения.
После выбора протокола прикладного уровня сервер отправляет сообщение ServerHello
с выбранным протоколом. После этого процесс TLS Handshake завершается, и клиент и сервер могут начать обмен данными в рамках выбранного протокола прикладного уровня.
ALPN поддерживается начиная с версии TLS 1.2. Для более ранних версий TLS используется NPN.
На текущий момент поддержка ALPN реализована следующими библиотеками:
- OpenSSL: с версии 1.0.2.
- GnuTLS: с версии 3.2.0.
- MatrixSSL: с версии 3.7.1.
- Network Security Services: с версии 3.15.5.
- LibreSSL: с версии 2.1.3.
- mbedTLS/PolarSSL: с версии 1.3.6.
- s2n: все версии.
- wolfSSL/CyaSSL: с версии 3.7.0.
- BearSSL: с версии 0.3.
- Win32 SSPI: начиная с Windows 8.1 и Windows Server 2012 R2.
- SChannel: под управлением Windows 8.1 / Windows Server 2012 R2.