【问题标题】:Is ALPN mandatory for server to establish TLSv1.3 connection via http/2 ("h2") protocol?服务器通过 http/2 ("h2") 协议建立 TLSv1.3 连接是否必须使用 ALPN?
【发布时间】:2022-01-25 18:40:11
【问题描述】:

我知道,如果我们谈论非安全连接,则可以通过 http/2 协议建立连接而无需 ALPN。 但是 TLS 连接呢?在RFC说:

   A client MUST send the connection preface (Section 3.5) and then MAY
   immediately send HTTP/2 frames to such a server; servers can identify
   these connections by the presence of the connection preface.  This
   only affects the establishment of HTTP/2 connections over cleartext
   TCP; **implementations that support HTTP/2 over TLS MUST use protocol
   negotiation in TLS [TLS-ALPN]**.

是否意味着服务器和客户端都必须使用 ALPN 通过 TLS 和 http2 建立连接?还是有解决方法和其他选择?

【问题讨论】:

    标签: http2 tls1.3 alpn


    【解决方案1】:

    兼容的 HTTP/2 客户端必须通过 TLS 发送 HTTP/2 的 ALPN 扩展。

    但是,如果 ALPN 扩展不存在,服务器会做什么? 这可能发生在旧客户端、不合规客户端或攻击者身上。

    服务器可以合法地配置为只使用 HTTP/2(例如,https://h2.domain.com),因此它可以假设正在使用的协议是 h2,而无需通过 ALPN 进行协商。这是一个实现/配置选择。 (如果没有 ALPN,另一个有效的选择可能是关闭连接)。

    RFC 还讨论了 ALPN 在跨协议攻击中的作用,请参阅 this section

    我认为 RFC 的意图是强制使用 ALPN;但是,服务器应该准备好在没有 ALPN 的情况下接收连接尝试,此时可以将其配置为关闭连接或采用默认协议,通常为http/1.1,但也可以是h2

    请记住,您可以始终在不使用 ALPN 的情况下使用 TLS 并执行 HTTP/1.1 到 HTTP/2 升级请求(在 ALPN 中,您声明要升级到的协议),这通常会成功作为服务器应该支持 HTTP/1.1 到 HTTP/2 的升级。 因此,即使没有 ALPN,您也可以在升级后对此类服务器使用 HTTP/2。

    服务器可能会假设,如果缺少 ALPN,客户端会尝试将 HTTP/1.1 升级到 HTTP/2。如果服务器没有看到升级(而是直接看到 HTTP/2 客户端前言),它可能会回复426 Upgrade Required(参见here)。

    【讨论】:

    • 我使用支持 ALPN 的 OkHttpClient。我需要通过 http2 与不是我开发的服务器建立 TLS 连接。此服务器不支持 ALPN,并且禁用了 http1.1(仅启用了 http2)。在 Client Hello 消息中,我发送 ALPN,但服务器不支持它。结果连接没有建立。我该怎么做才能建立连接?
    • 您需要了解如何配置服务器以接受连接。正如我所说,如果服务器不支持 ALPN 但使用 HTTP/2,它可以配置为接受连接并立即使用 HTTP/2,或者关闭连接。或者,如果您可以在客户端上禁用 ALPN(甚至不发送 ALPN 扩展,或者将其发送为空),只需执行普通的 HTTP/1.1 到 HTTP/2 升级(不确定如何使用 OkHttpClient 进行此操作) .
    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2021-09-09
    • 2010-10-06
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多