SNI协议分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SNI协议分析相关的知识,希望对你有一定的参考价值。

参考技术A 服务器名称指示(英语:Server Name Indication,简称SNI)是一个扩展的TLS计算机联网协议,在该协议下,在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。这允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全HTTPS网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书。

基于名称的虚拟主机允许多个DNS主机名由同一IP地址上的单个服务器(通常为Web服务器)托管。为了实现这一点,服务器使用客户端提供的主机名作为协议的一部分(对于HTTP,名称显示在主机头中)。但是,当使用HTTPS时,TLS握手发生在服务器看到任何HTTP头之前。因此,服务器不可能使用HTTP主机头中的信息来决定呈现哪个证书,并且因此只有由同一证书覆盖的名称才能由同一IP地址提供。

所以,需要由SNI协议在握手时提供主机名的信息。

如果我们要对流量进行识别,做流量检测等,HTTPS流量是加密的,很难检测其内部的具体内容。SNI协议给出了一个切入点,在HTTPS协议建立加密连接的开始阶段检测出访问的域名信息。

抓取访问HTTPS的数据包,之后,通过使用显示过滤器语句 ssl.handshake 来过滤出想要的报文。分析报文发现server_name的扩展字段只存在于Client Hello这个过程中。

接下来,进一步过滤,使用显示过滤器语句 ssl.handshake.extensions_server_name ,提取出包含SNI协议的Client Hello报文。

下面这个箭头所指表示了SNI协议的格式,

Type(2B) | Length(2B) | Server Name list length(2B) | Server Nma Type(1B) | Server Name length(2B) | Server name

SNI: 实现多域名虚拟主机的SSL/TLS认证: https://shansing.com/read/355/

RFC6066: https://tools.ietf.org/html/rfc6066#page-5

通过wireshark抓包分析SNI字段及支持加密套件集

如果客户端支持SNI,那在SSL握手的Client Hello环节能找到SNI扩展部分;如果不支持,则没有该扩展部分。下图为支持SNI的样例:
技术图片

从上图的Client Hello环节还可以看到客户端的支持加密套件集,通过下图可以通过服务端响应的Server Hello环节,找到双方协商所采用的加密套件。

技术图片

以上是关于SNI协议分析的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡器新增支持 SNI 协议——可绑定多个服务器证书

通过wireshark抓包分析SNI字段及支持加密套件集

关于Nginx根据SNI字段匹配对应证书加密套件支持

SNI

网络协议分析

网络协议分析课程设计:基于TCP协议网上聊天程序