什么是 SNI?
介绍
是什么:SNI(Server Name Indication)是 TLS 的扩展,这允许在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。
作用:用来解决一个服务器拥有多个域名的情况。
在客户端和服务端建立 HTTPS 的过程中要先进行 TLS 握手,握手后会将 HTTP 报文使用协商好的密钥加密传输。
握手参考:链接
在 TLS 握手信息中并没有携带客户端要访问的目标地址。这样会导致一个问题,如果一台服务器有多个虚拟主机,且每个主机的域名不一样,使用了不一样的证书,该和哪台虚拟主机进行通信?
和 HTTP 协议用来解决服务器多域名的方案类似:HTTP 在请求头中使用 Host 字段来指定要访问的域名。
TLS 的做法,也是加 Host,在 TLS 握手第一阶段 ClientHello 的报文中添加。
SNI 在 TLSv1.2 开始得到支持。从 OpenSSL 0.9.8 版本开始支持。所以基本市场上的终端设备都支持。
测试
使用 WireShark 抓包看一下 Clien tHello:
SNI信息是在握手的过程中,确切说是在客户端发送给服务端的第一个握手包中传递的信息。
这时候SSL连接还未建立起来,因此SNI信息是明文传输的。