服务器名称标识到底是啥?
问题描述
TLS协议扩展SNI(服务器名称标识)字段为空,是否意味一个IP上只有一个网站,而不是托管了多个网站?
答案是肯定的。SNI字段为空,意味着服务器是独占的,只为一个网站提供一对一服务。
HTTP
一个托管服务器(Host Server),如果托管的是明文的http服务,仅仅依靠Http Header里的hostname, domain这些字段,就可以分辨出客户端想要连接哪个网站,从而将客户端请求的网页返还给客户端。
HTTPS
为何Https就不能像Http那样呢?为何需要一个全新的SNI字段来分辨谁才是真正的目的服务器?
因为客户端与托管服务器在建立TCP连接之后,紧接着进行的是TLS安全握手,此时压根没有http什么事。
安全握手最关键的一步,是托管服务器将特定客户服务器的证书推送给客户端,以方便客户端来验证服务器是否合法。
但是,托管服务器上可能有成百上千的客户证书,如果客户端不给点提示,托管服务器如何知道挑选哪个证书推送给客户端?
SNI (Server Name Indication)
有了SNI字段就简单了,里面填入了目标服务器域名,然后托管服务器就可以根据SNI字段信息做为索引,查询数字证书数据库,提取出对应的证书。在Server Hello报文里以“Certificate”消息推送给客户端,客户端验证成功,最后双方协商了一个安全的TLS加密隧道,就可以将明文的Http报文扔到TLS隧道里。
很显然SNI字段位于TLS协议头里,并以明文的方式呈现。SNI字段填入的信息,由客户端从http里协议头里提取,并赋值给SNI。
托管服务器上存有目标服务器的证书私钥吗?
对于理论扎实的读者,即使没有部署过托管服务,也可以凭逻辑推理就可以知道,而完全不需要求助于别人。
密钥分发阶段,如果使用到RSA公钥加密“Pre-Master Secret”,托管服务器需要使用私钥才能解密并获得明文的“Pre-Master Secret”,必须拥有明文的私钥。握手连接时,凡是需要私钥签名的部分,同样需要私钥。
为了便利地完成这些任务,托管服务器通常都拥有目标服务器的私钥。
托管服务器是怎样的存在?
逆向代理,即代理目标服务器与客户端通信,这个逆向代理,代理的是HTTPS安全通信。
代理服务器与目标服务器之间的通信,同样也使用HTTPS来完成,此时代理服务器就是客户端,而目标服务器是服务器。
有读者可能会不解地问,既然代理服务器所有的数据都来源于目标服务器,那它有什么样的存在价值呢?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论