主题别名(Subject Alternative Name )和服务器名称指示(Server Name Indication)

来源:https://en.wikipedia.org/wiki/Subject_Alternative_Name

Subject Alternative Name (SAN)是X.509的扩展名,它允许使用Subject taltname字段将各种值与安全证书关联起来。这些值称为Subject Alternative Names (SANs)。名称包括:

(1)电子邮件地址

(2)IP地址

(3)uri

(4)DNS名称(通常也在主证书的Subject字段中作为通用名称RDN提供)。

(5)目录名(与主题中给定的名称不同的其他专有名称)

(6)其他名称,作为通用名称给出:一个已注册的[3]对象标识符,后跟一个值


来源:https://en.wikipedia.org/wiki/Server_Name_Indication

服务器名称指示(SNI)是TLS计算机网络协议的扩展,通过该协议,客户机在握手过程开始时指示要连接到哪个主机名。这允许服务器在相同的IP地址和TCP端口号上显示多个证书,从而允许由相同的IP地址提供多个安全(HTTPS)站点(或TLS上的任何其他服务),而不需要所有这些站点使用相同的证书。它在概念上等同于HTTP/1.1基于名称的虚拟主机,但适用于HTTPS。所需的主机名在原始SNI扩展中没有加密,因此窃听者可以看到请求的是哪个站点。

一、问题背景

在进行TLS连接时,客户机从web服务器请求一个数字证书。一旦服务器发送证书,客户机就会检查它,并将它试图连接的名称与证书中包含的名称进行比较。如果匹配发生,连接将正常进行。如果没有找到匹配项,则可能会警告用户该差异,并且连接可能会中止,因为不匹配可能表明有人试图进行中间人攻击。然而,一些应用程序允许用户绕过警告继续连接,由用户承担信任证书(扩展为信任连接)的责任。

但是,要获得一个包含服务器将负责的所有名称的证书可能很困难,甚至是不可能的,因为没有预先列出所有名称的完整列表。负责多个主机名的服务器可能需要为每个名称(或一小组名称)提供不同的证书。自2005年以来,CAcert在虚拟服务器上运行了使用TLS的不同方法的实验。大多数实验都不令人满意而且不切实际。例如,可以使用subjectAltName在一个证书中包含由一个人[4]控制的多个域。这种“统一通信证书”必须在域列表每次更改时重新颁发。

基于名称的虚拟主机允许一个服务器(通常是一个web服务器)在同一个IP地址上承载多个DNS主机名。为了实现这一点,服务器使用客户机作为协议的一部分显示的主机名(对于HTTP,该名称在主机头中显示)。然而,当使用HTTPS时,TLS握手发生在服务器看到任何HTTP头之前。因此,服务器不可能使用HTTP主机头中的信息来决定要显示哪个证书,因此只能从相同的IP地址提供相同证书所覆盖的名称。

实际上,这意味着HTTPS服务器只能为每个IP地址提供一个域(或一小组域),以实现安全高效的浏览。为每个站点分配单独的IP地址会增加托管成本,因为对IP地址的请求必须经过区域internet注册中心的验证,IPv4地址现在已经耗尽。其结果是,许多网站实际上受到了限制,无法使用IPv4上的安全通信。IPv6地址空间没有用尽,所以使用IPv6服务的网站不受这个问题的影响。

二、SNI如何解决这个问题

SNI通过让客户端发送虚拟域的名称作为TLS协商的一部分来解决这个问题。这使服务器能够尽早选择正确的虚拟域,并向浏览器提供包含正确名称的证书。因此,对于实现SNI的客户机和服务器,具有单个IP地址的服务器可以为一组域名提供服务,对于这些域名,获得公共证书是不切实际的。

SNI于2003年6月通过RFC 3546传输层安全(TLS)扩展添加到IETF的Internet RFC cs中。最新版本的标准是RFC 6066

三、安全影响

所需的主机名没有加密,因此窃听者可以看到正在请求哪个站点。这有助于安全公司提供过滤功能和政府实施审查。虽然域前端被用作一种解决方案,但现在谷歌和AWS都采取了行动来禁止这种做法,因此它不再是一种备选方案。

截至2018年年中,一项名为加密SNI (ESNI)的升级正在“实验阶段”推出,以解决域名被窃听的风险

四、实现

2004年,EdelKey项目创建了一个补丁,用于将TLS/SNI添加到OpenSSL中。在2006年,这个补丁被移植到OpenSSL的开发分支,并在2007年被移植到OpenSSL 0.9.8(在0.9.8f中首次发布)。

对于要实现SNI的应用程序,它使用的TLS库必须实现SNI,并且应用程序必须将主机名传递给TLS库。更复杂的是,TLS库可能包含在应用程序中,也可能是底层操作系统的组件。因此,一些浏览器在运行任何操作系统时实现SNI,而另一些浏览器仅在运行某些操作系统时实现SNI。

你可能感兴趣的:(主题别名(Subject Alternative Name )和服务器名称指示(Server Name Indication))