通过 SSL 需要 Host: 标头吗?

ImB*_*ime 6 ssl http host-headers

即使请求不是 HTTP/1.1,是否也需要通过 SSL 的 Host: 标头?

因此,如果客户端通过 SSL 连接,并发送以下请求:

GET / HTTP/1.0
Run Code Online (Sandbox Code Playgroud)
  1. 由于缺少 Host: 标头,Web 服务器是否应该抛出错误的请求?
  2. Web 服务器是否应该以 HTTP/1.0 200 OK 响应进行响应?
    ( index.html 文件始终存在,因此对/的请求永远不会导致 403/404)

更新:

如果我在 中禁用 SNI openssl s_client,apache 将在没有 Host: 标头的情况下工作。

为什么在 SNI 开启时需要 Host: 标头?

Ste*_*ich 17

根据标准,HTTP/1.0 请求不需要 Host,但在实践中通常仍需要此标头来决定要提供哪些内容的多域设置。但是,如果此标头不存在并且仍清楚要提供哪些内容,则可以在不需要标头的情况下提供此内容。请注意,这与 TLS 和 SNI 的使用无关。


kbo*_*ino 6

要回答更新中添加的问题部分,

为什么在 SNI 开启时需要 Host: 标头?

“需要”是一个强烈的词,但它有助于理解 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 中的名称匹配可能会在某些设置中打开安全漏洞。