什么是 SNI?TLS 服务器名称指示如何工作

SNI(服务器名称指示)是 TLS 加密协议的补充,它使客户端设备可以指定在 TLS 握手的第一步中尝试访问的域名,从而防止了通用名称不匹配错误。

学习目标

阅读本文后,您将能够:

  • 阐释什么是虚拟主机名
  • 了解为什么服务器可能提供错误的 SSL 证书
  • 了解 SNI 如何解决此问题

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

什么是 SNI(服务器名称指示)?

SNI 有点像邮寄包裹到公寓楼而不是独栋房子。将邮件邮寄到某人的独栋房子时,仅街道地址就足以将包裹发送给收件人。但是,当包裹进入公寓楼时,除了街道地址外,还需要公寓号码。否则,包裹可能无法送达收件人或根本无法交付。

许多 Web 服务器更像是公寓大楼而不是独栋房子:它们承载多个域名,因此仅 IP 地址不足以指示用户尝试访问哪个域。这可能会导致服务器显示错误的 SSL 证书,从而阻止或终止 HTTPS 连接——就像如果没有正确的收件人签名,包裹将无法送到指定的地址一样。

当多个网站托管在一台服务器上并共享一个 IP 地址,并且每个网站都有自己的 SSL 证书,在客户端设备尝试安全地连接到其中一个网站时,服务器可能不知道显示哪个 SSL 证书。这是因为 SSL/TLS 握手发生在客户端设备通过 HTTP 指示连接到某个网站之前。

服务器名称指示 (SNI) 旨在解决此问题。SNI 是 TLS 协议(以前称为 SSL 协议)的扩展,该协议在 HTTPS 中使用。它包含在 TLS/SSL 握手流程中,以确保客户端设备能够看到他们尝试访问的网站的正确 SSL 证书。该扩展使得可以在 TLS 握手期间指定网站的主机名或域名 ,而不是在握手之后打开 HTTP 连接时指定。

简而言之,即使网站 https://www.example.com 托管在与 https://www.something.com、https://www.another-website.com 和 https://www.example.io 相同的地方(相同的 IP 地址),SNI 也能让用户的设备与 https://www.example.com 建立安全的连接。

SNI 可防止所谓的“常见名称不匹配错误”:即客户端(用户)设备到达了网站的正确 IP 地址,但 SSL 证书上的名称与网站名称不匹配。通常这种错误会导致用户浏览器中出现“您的连接不是专用连接”错误消息。

SNI 在 2003 年被添加为 TLS/SSL 的扩展;它最初不是协议的一部分。几乎所有的浏览器、操作系统和 Web 服务器都支持它,除了一些仍在使用的最旧的浏览器和操作系统。

注册
使用 Cloudflare 的免费 SSL/TLS 提高安全性和信任度

服务器名称是什么?

尽管 SNI 代表服务器名称指示,但 SNI 实际上"表示"的是网站的主机名或域名,可以与实际托管该域的 Web 服务器的名称分开。事实上,将多个域托管在同一台服务器上很常见——在这种情况下,它们被称为虚拟主机名。

服务器名称就是计算机的名称。对于 Web 服务器,此名称通常对最终用户不可见,除非该服务器仅托管一个域并且该服务器名称与该域名等同。

TLS 的 SNI 扩展有什么作用?

一个 Web 服务器通常负责多个主机名 - 或域名(它们是网站的人类可读名称)。如果网站使用 HTTPS,则每个主机名都将拥有自己的 SSL 证书。

问题是,一台服务器上的所有这些主机名都在同一个 IP 地址上。这在 HTTP 上不是问题,因为一旦打开 TCP 连接,客户端就会在 HTTP 请求中指示他们试图访问的网站。

但是在 HTTPS 中,先有 TLS 握手,然后才能开始 HTTP 对话(HTTPS 仍使用 HTTP –它只是对 HTTP 消息进行加密)。如果没有 SNI,客户端将无法向服务器指示正在与之通信的主机名。结果,服务器可能为错误的主机名生成 SSL 证书。如果 SSL 证书上的名称与客户端尝试访问的名称不匹配,则客户端浏览器将返回错误信息,并通常会终止连接。

SNI 将域名添加到 TLS 握手过程,以便 TLS 程序到达正确的域名并接收正确的 SSL 证书,从而使其余 TLS 握手能够正常进行。

具体来说,SNI 会在“Client Hello(客户端问候)”消息或 TLS 握手的第一步就包含了主机名。

白皮书
最大化 TLS 的力量

什么是主机名?什么是虚拟主机名?

主机名是连接到网络的设备的名称。在互联网背景中,域名或网站名称是一种主机名。两者都与与域名关联的 IP 地址分开。

虚拟主机名是没有自己的 IP 地址的主机名,它与其他主机名一起托管在服务器上。它是"虚拟的" ,因为它没有专用的物理服务器,就像虚拟现实仅以数字形式存在,而不是在物理世界中一样。

什么是加密的 SNI(ESNI)?

加密 SNI (ESNI) 通过加密客户端问候的 SNI 部分来添加到 SNI 扩展。这可以防止任何在客户端和服务器之间窥探的人看到客户端正在请求哪个证书,从而进一步保护客户端。Cloudflare 和 Mozilla Firefox 于 2018 年推出了对 ESNI 的支持。

如果用户的浏览器不支持 SNI,会发生什么?

在这种罕见的情况下,用户可能无法访问某些网站,并且用户的浏览器将返回错误消息,例如"您的连接缺乏安全隐私。"

绝大多数浏览器和操作系统都支持 SNI。仅非常旧版本的 Internet Explorer、旧版的 BlackBerry 操作系统以及其他过时的软件版本不支持 SNI。

要详细了解 TLS/SSL 协议、SSL 证书以及 HTTPS 的工作原理,请参阅什么是 SSL 证书?,或从 Cloudflare 获取免费的 SSL 证书