SNI协议分析

SNI协议分析,第1张

服务器名称指示(英语: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

SNI指是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

上面这句哪都有,没什么含金量。下面是我的理解。

SSL网站用的证书,提交到web服务器时,原本设计的是按服务器IP+端口来提交的。这样就造成了同一服务器IP的443端口,只能用一个证书。这样设计比同一IP和端口的,多主机头设计差太多。于是提出SNI标准,以后新的SSL和服务器,允许用主机头 + 端口方式提交到同一服务器上,这样就灵活多了。

要讨论 SNI 的问题,首先需要来介绍一个虚拟主机的概念。

虚拟主机 一般使用的技术为软硬件,它可以把一台真实的物理电脑主机进行划分,让它变成多个逻辑的存储单元,每一个单元中不会再有物理的实体,但是在单元内,却可以和真实的物理主机一样正常的工作,实现 IP 地址,单独的域名,完整的 Internet 服务器的工作。其中关键一点就是,虚拟主机的主要技术是在同一操作系统,同一硬件平台上,也能为用户提供不同的服务,且服务间互不干扰。

各种服务器软件都可以实现虚拟主机的配置,例如 Apache, nigx 等。其中

Apache 虚拟主机实现有 三种方法:

在互联网爆发的今天,网络安全问题越来越受到重视,也带来了目前的 https 大热的盛况。而 SSL证书是 https是加密协议的最常见解决方案。但是 https 在使用的过程中因为 SSL 证书而存在一个问题。

问题由来: 由于服务器能力的增强,在一台物理服务器上部署多个虚拟主机已经成为十分流行的做法了。在过去的 HTTP 时代,解决基于名称的主机同一 ip 地址上托管多个网站的问题并不难。当一个客户端请求某特定网站时,把请求的域名作为主机头(host)放在 http header 中,从而服务器根据域名可以知道把该请求引向哪个域名服务,并把匹配的网站传送给客户端。但是此方式到 https 就失效了,因为 SSL 在握手的过程中,不会有 host 信息,所以服务端通常返回配置中的第一个可用证书,这就导致不同虚拟主机上的服务不能使用不同证书(但在实际中,证书通常是与服务对应。)。

为了解决此问题,产生了 SNI,SNI 中文名为服务器名称指示,是对 SSL/TLS 协议的扩展,允许在单个 IP 地址上承载多个 SSL 证书。SNI 的实现方式是将 HTTP 头插入到 SSL 的握手中,提交请求的 Host 信息,使得服务器能够切换到正确的域并返回相应的正确证书。

SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。 在 TLSv1.2(OpenSSL 0.9.8)版本开始支持。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/686763.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-31
下一篇2023-07-31

发表评论

登录后才能评论

评论列表(0条)

    保存