Application-Layer Protocol Negotiation

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

ALPN (англ. Application-Layer Protocol Negotiation — протокол узгодження прикладного рівня) — це розширення Transport Layer Security (TLS), яке дозволяє прикладному рівню узгоджувати, який протокол слід виконувати через захищене з'єднання, таким чином, щоб уникнути додаткових двосторонніх запитів, і яке не залежить від протоколів прикладного рівня. Це потрібно для безпечних з'єднань HTTP/2, що покращує стиснення вебсторінок і зменшує їх затримку у порівнянні з HTTP/1.x. Стандарт ALPN з'явився внаслідок роботи Google, над уже вилученим протоколом SPDY, який став основою HTTP/2.

Підтримка[ред. | ред. код]

ALPN підтримується цими бібліотеками.

  • 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.[4]
  • LibreSSL з версії 2.1.3, випущеної у січні 2015.[5]
  • mbed TLS (раніше PolarSSL) з версії 1.3.6, випущеної у квітні 2014.[6]
  • SChannel з Windows 8.1 / 2012 R2.
  • s2n з моменту першого публічного випуску, у червні 2015.
  • wolfSSL (раніше CyaSSL) з версії 3.7.0, випущеної у жовтні 2015.[7]
  • Go (у стандартній бібліотеці crypto/tls) з версії 1.4, випущеної у грудні 2014.[8]
  • picotls.[9]
  • JSSE в Java, починаючи з випуску JDK 9, у вересні 2017.[10], зворотно перенесена[en] у JDK 8, починаючи з квітня 2020.[11]
  • BearSSL з версії 0.3.[12]
  • Win32 SSPI з часу випуску Windows 8.1 та Windows Server 2012 R2, 18 жовтня 2013.[13]

Історія[ред. | ред. код]

11 липня 2014 р. ALPN був опублікований як RFC 7301. Згодом замінює NPN.[14]

Помилковий запуск TLS було вимкнено у Google Chrome, з версії 20 (2012), за винятком вебсайтів із попереднім розширенням NPN (англ. Next Protocol Negotiation — узгодження наступного протоколу).[15]

Приклад[ред. | ред. код]

ALPN - це розширення TLS, яке надсилається при відкритті сеансу рукостискання TLS 'Client Hello', і в ньому перелічуються протоколи, які підтримує клієнт (наприклад, веббраузер):

    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. Архів оригіналу за 2016-01-31. Процитовано 2015-01-26. 
  2. MatrixSSL - News. 2014-12-04. Архів оригіналу за 2015-02-14. Процитовано 2015-01-26. 
  3. NSS 3.15.5 release notes. Mozilla Developer Network. Mozilla. Процитовано 2015-01-26. 
  4. OpenSSL 1.0.2 release notes. The OpenSSL Project. The OpenSSL Project. 2015-01-22. Процитовано 2015-01-26. 
  5. LibreSSL 2.1.3 released. 2015-01-22. Процитовано 2015-01-26. 
  6. Download overview - PolarSSL. 2014-04-11. Процитовано 2015-01-26. 
  7. wolfSSL Release Change Log. 2015-10-26. Процитовано 2015-09-11. 
  8. Go 1.4 Release Notes. 2014-12-10. Процитовано 2017-11-28. 
  9. Picotls. Github. Процитовано 2 August 2018. 
  10. JEP 244: TLS Application-Layer Protocol Negotiation Extension. 2017-08-07. Процитовано 2018-08-29. 
  11. {{cite web|title=Release Note: TLS Application-Layer Protocol Negotiation Extension|url=https://bugs.openjdk.java.net/browse/JDK-8242894%7Cdate=2020-04-30%7Caccessdate=2020-06-11}
  12. BearSSL - Changelog. Процитовано 2010-09-08. 
  13. What's New in TLS/SSL (Schannel SSP). Процитовано 2020-03-30. 
  14. Langley, Adam. » NPN and ALPN. Процитовано 2 April 2013. 
  15. Langley, Adam. False Start's Failure (11 Apr 2012). Процитовано 25 September 2013. 

Посилання[ред. | ред. код]