关于 https 的 SNI(Sever Name Indication) 问题记录

1 虚拟主机

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

1.1 概念

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

1.2 实现

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

  • 通过不同的 IP 地址
  • 通过不同的域名
  • 通过不同的端口

2 SNI(服务器名称指示)

在互联网爆发的今天,网络安全问题越来越受到重视,也带来了目前的 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)版本开始支持。

Extension: server_name
    Type: server_name (0x0000)
    Length: 16
    Server Name Indication extension
        Server Name list length: 14
        Server Name Type: host_name (0)
        Server Name length: 11
        Server Name: nex.163.com

你可能感兴趣的:(关于 https 的 SNI(Sever Name Indication) 问题记录)