0

我知道,如果我们谈论非安全连接,则可以在没有 ALPN 的情况下通过 http/2 协议建立连接。但是 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 建立连接?还是有解决方法和其他选择?

4

1 回答 1

0

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

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

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

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

我认为 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(参见此处)。

于 2022-01-25T10:40:11.627 回答