ALPN(Application Layer Protocol Negotiation)


ALPN (Application Layer Protocol Negotiation)是TLS的擴展,允許在安全連接的基礎上進行應用層協議的協商。ALPN支持任意應用層協議的協商,目前應用最多是HTTP2的協商。當前主流瀏覽器,都只支持基於 HTTPS 部署的 HTTP/2,因為瀏覽器是基於ALPN協議來判斷服務器是否支持HTTP2協議。

協商原理

 在TLS的Say Hello階段增加應用層協議的協商,如下圖所示:

 我們可以通過WireShark抓包分析ALPN協商協議交互的過程。

  • 瀏覽器在進行SSL連接,第一次發送Client Hello包時,在擴展字段里攜帶瀏覽器支持的版本,其中 h2 代表瀏覽器支持http2協議。

    

  •  服務器在返回Server Hello包時,如果服務器支持http 2,則會返回h2,如果不支持,則從客戶端支持的協議列表中選取一個它支持的協議,一般為http/1.1。

 

 瀏覽器和服務端都支持ALPN 協商,是用上 HTTP/2 的大前提。

  • Android 手機從5.0版本開始支持ALPN,OkHttp源代碼里通過以下代碼判斷手機是否支持ALPN:
  public static boolean supportsAlpn() { if (Security.getProvider("GMSCore_OpenSSL") != null) { return true; } else { try { Class.forName("android.net.Network"); // Arbitrary class added in Android 5.0.
        return true; } catch (ClassNotFoundException ignored) { } } return false; }
  •  大部分 Web Server 都依賴 OpenSSL 庫提供 https服務,是否支持 ALPN 完全取決於使用的 OpenSSL 版本,OpenSSL 1.0.2 版本才開始支持 ALPN。

查看網站是否支持HTTP2/ALPN

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM