http2:421误导请求状态码示例

时间:2017-01-21 23:44:21

标签: http-status-codes http2 http-status-code-421

我正在阅读spec并尝试准确了解何时可能会返回421。给出了一个例子,但我并不完全理解它。

背景

规范建立了两个允许连接重用的条件:

  

对于没有TLS的TCP连接,这取决于主机已解析为相同的IP地址。

  

对于https资源,连接重用另外取决于具有   对URI中的主机有效的证书。

如果连接中使用的证书有多个subjectAltName或任何subjectAltName是通配符,则该连接可以重用于{{列表}中包含主机名的任何请求{1}}或匹配任何通配符。

具体示例在规范

  

在某些部署中,重用多个来源的连接可以   导致请求被定向到错误的源服务器。对于   例如,TL​​S终止可能由使用的中间盒执行   用于选择的TLS服务器名称指示(SNI)[TLS-EXT]扩展名   原始服务器。这意味着客户端可以发送   机密信息到服务器可能不是预期的   请求的目标,即使服务器是另外的   权威。

请解释我对此示例的理解错误:

与具有域subjectAltName的请求的中间件建立https连接。中间件的IP地址为1.2.3.4,x.com解析为该地址。使用SNI,TLS握手具有x.com,中间框返回对该域有效的证书。此连接上的所有消息都从客户端到中间盒或从中间盒到客户端。从客户端到中间件的应用级消息由中间盒转发到不同连接上的源。从origin到middlebox的消息被转发到客户端。如果要重用连接,则满足上述两个条件是不够的。具体而言,对于具有域x.com的请求:如果y.com解析为1.2.3.4并且中间件具有对y.com有效的证书,则仍可能存在问题。因为原始连接使用y.com进行了TLS握手,并且因为握手仅在新连接开始时完成,所以无法建立可获得x.com证书的https连接。因此,客户端错误地将同一连接上的请求发送到y.com。中间框拒绝该请求,因为与该连接关联的证书对y.com有效 - 而不是x.com。 (y.com证书仅对x.com有效,x.com证书仅对y.com有效。

1 个答案:

答案 0 :(得分:4)

就我所见,你的所有例子都不会触发421。

是的,你是正确的,连接需要 证书中的IP地址和SAN字段才有效 - 没有连接不应重复使用。

那么什么会触发421?据我所知,这主要是由于不同的SSL / TLS设置。

例如: 假设网站A(siteA.example.com)和网站B(www.example.com)都在相同的IP地址上。假设网站A具有* .example.com的通配符证书,而网站B具有特定的通配证书。可能有以下几个原因:例如,它为主网站提供EV证书,而不是通配符证书。

因此,证书A涵盖网站A和网站B.与IP地址一样。因此,如果您连接到siteA.example.com网站,然后尝试连接到www.example.com,那么从技术上讲,通过HTTP / 2标准,您可以重用该连接。但我们不希望这种情况发生,因为我们想要使用我们的EV证书。因此,服务器应拒绝使用421.现在在此示例中,Web服务器能够区分正确的主机并具有该主机的有效证书,因此理论上可以在通配符证书下提供正确的内容,而不是发送421 - 但由于没有为该虚拟主机定义通配符证书,因此不应该这样做。

其他示例包括您是否在不同主机上设置了不同的密码。例如,站点A具有超级宽松的HTTPS配置,因为它不是真正安全的内容,并且他们希望甚至可以访问旧版浏览器,但站点B具有超级安全配置并且仅接受最新的TLS版本和强密码。在这里,您显然不希望他们重复使用相同的连接细节。请参阅here了解真实情况。

对于某些浏览器而言,这只是一个问题,具体取决于他们决定连接共享的方式。这个页面显示了他们每个人的不同之处(至少在这篇博文发表时并不知道从那时起发生的任何变化):https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/

另请注意,此处会存在一些错误(例如:https://bugs.chromium.org/p/chromium/issues/detail?id=546991)。最好的建议是:如果您不希望发生连接共享,请使用不同的IP地址和/或确保证书不会重叠。