如果我example.com
的 DNS 后缀搜索列表中有内容,我打开浏览器并输入,www
那么浏览器将与操作系统对话,操作系统再与 DNS 对话;如果www
解析失败,我的操作系统将从我的后缀搜索列表中附加项目,直到成功为止;www.example.com
如果成功,我就会得到一个将我的请求发送到的 IP。
但是,查看我的浏览器发送的请求,主机标头设置为,www
因为这是地址栏中输入的内容,即使这不是最终解析为 IP 的 FQDN。这意味着,如果 Web 服务器使用主机名绑定,它必须监听www
以及 FQDN www.example.com
,否则它将无法识别该请求是它应该处理的请求。
是否有任何浏览器具有自动从操作系统获取已解析的 FQDN 的功能/是否有任何设置可以调整以启用此功能?如果没有这样的功能,是否有原因(例如,操作系统可能出于某种安全原因不公开已成功解析的 FQDN 的信息?),或者这种情况太小众以至于任何人都无法实现?
我想说这太小众了,但这也是出于安全原因。用户提供的 URL 中的主机名不仅用于 HTTP Host 标头;它还用于匹配服务器的 TLS 证书和选择服务器的 Kerberos 主体 - 这两个功能的目的是防止主动网络攻击者冒充服务器。
当您考虑到 Windows 甚至会尝试使用人们认为合格的名称作为 DNS 后缀(例如,它会将www.google.com扩展为www.google.com.example.com)时,您就会明白这可能会导致什么结果 - 恶意 DNS 服务器会将您重定向到具有www.google.com.example.com证书的其他服务器,并且浏览器会接受它,即使这不是用户访问的服务器?
(通常的系统解析器确实提供了全名,例如 getaddrinfo() 中的 ai_canonname,实际上 Unix Kerberos 仍然信任DNS - 仅通过 Kerberos 主体注册的封闭性质来缓解 - 但这一点仍然适用于 TLS 和 Windows Kerberos。)