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.
Currently, ALPN support is implemented by the following libraries:
- 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