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

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

Share facebook icon linkedin icon twitter icon email icon

SNI

学习目标

阅读本文后,您将能够:

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

什么是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服务器都支持它,除了一些仍在使用的最旧的浏览器和操作系统。

服务器名称是什么?

尽管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握手的第一步就包含了主机名。

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

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

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

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

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

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

要了解有关TLS / SSL协议、SSL证书以及HTTPS工作原理的更多信息,请参阅什么是SSL证书?