即使请求不是 HTTP/1.1,主机是否也需要 SSL 标头?
因此,如果客户端通过 SSL 连接,并发送以下请求:
GET / HTTP/1.0
- Web 服务器是否应该由于缺少 Host: 标头而引发错误请求?
- Web 服务器是否应该使用 HTTP/1.0 200 OK 响应来响应?( index.html 文件始终存在,因此对/
的请求永远不会导致 403/404)
更新:
如果我在 中禁用 SNI openssl s_client
,则 apache 将在没有 Host: 标头的情况下工作。
为什么在 SNI 开启时需要 Host: 标头?
根据标准,HTTP/1.0 请求不需要 Host,但在实践中通常仍需要此标头来决定要提供哪些内容的多域设置。但是,如果此标头不存在并且仍然清楚要提供哪些内容,则可以在不需要标头的情况下提供此内容。请注意,这与 TLS 和使用 SNI 无关。
要回答更新中添加的部分问题,
“需要”是一个强词,但它有助于理解 SNI 和 HTTP 标头在两个不同的层上运行,因此服务于两个不同的目的。
SNI主要用于确定向客户端提供哪个证书。在具有多个虚拟主机的设置中,在解密有效负载之前,服务器必须向客户端提供证书。由于证书包含站点的名称,传统上是证书主题的通用名称,但最近在 X.509 扩展主题替代名称中,提供错误的证书会导致客户端在发送 HTTP 请求之前拒绝连接到服务器。
而
Host
标头主要用于确定要服务的资源。在表现良好的客户端中,这与 SNI 中的名称是多余的,但 HTTP/1.1 与SSL 3.0几乎同时开发,因此甚至早于 TLS-SNI 扩展存在。事实上,正是 HTTP/1.1 和 SSL/TLS 的结合才发现了对 SNI 的需求。值得注意的是,HTTP/2不需要标
Host
头,但具有:authority
伪标头形式的功能等效项。尽管在大多数情况下,该标头中的信息对于 TLS-SNI 仍然是冗余的,但它简化了实现以始终包含它。始终包含
Host
(or:authority
) 标头也留下了准系统 SSL 终止的可能性(尽管实际上很少支持没有 TLS 的 HTTP/2)。但是,不验证主机/权限是否与 TLS-SNI 中的名称匹配可能会在某些设置中打开安全漏洞。