我正在阅读spec并尝试准确了解何时可能会返回421。给出了一个例子,但我并不完全理解它。
背景
规范建立了两个允许连接重用的条件:
对于没有TLS的TCP连接,这取决于主机已解析为相同的IP地址。
和
对于https资源,连接重用另外取决于具有 对URI中的主机有效的证书。
如果连接中使用的证书有多个subjectAltName
或任何subjectAltName
是通配符,则该连接可以重用于{{列表}中包含主机名的任何请求{1}}或匹配任何通配符。
具体示例在规范
中在某些部署中,重用多个来源的连接可以 导致请求被定向到错误的源服务器。对于 例如,TLS终止可能由使用的中间盒执行 用于选择的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
有效。
答案 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地址和/或确保证书不会重叠。