Answers:
SAN(主题备用名称)是X509证书规范的一部分,该证书具有一个字段,其中包含对于该主题也有效的备用名称列表(除了单个“通用名称/ CN”)。本质上,此字段和通配符名称是将一个证书用于多个名称的两种方式。
SNI(服务器名称指示)是TLS协议扩展,类似于HTTP主机头的TLS协议。当客户端发送此消息时,它允许服务器选择要呈现给客户端的适当证书,而没有在服务器端使用单独的IP地址的限制(就像HTTP Host标头被大量用于纯HTTP一样)。
请注意,SNI并非反映在证书中,它实际上实现了与问题要求相反的功能;它简化了拥有多个证书的过程,而在很多事情上都不使用一个证书。
另一方面,这实际上取决于情况,即哪种路径实际上是更可取的。举例来说,如果您需要不同实体的证书,那么问题的要求几乎肯定不是您真正想要的。
SAN代表Subject Alternative Name,它是x509证书属性,而SNI是SSL / TLS客户端可以支持的功能,因此是一个完全不同的实体。
使用带有SAN的证书,即使客户端不支持SNI,您也可以在一个IP地址上托管多个启用HTTPS的站点。在这种情况下,您为所有站点都持有一个证书,并且该证书必须包含所有站点名称(在Apache坐标中或在Nginx中为ServerName
s或ServerAlias
es server_name
)作为其SAN。这是旧方法的子集,它确实扩展了“每个单独IP地址上的一个启用HTTPS的站点”。当前,只有大型CDN才使用SAN。
使用SNI,您还可以在一个IP上托管多个启用HTTPS的站点,您为每个站点持有一个单独的x509证书,这些站点的SAN属性均未提及其他站点名称,但TLS客户端(例如,浏览器和控制台客户端,例如wget
或curl
)必须支持SNI。这是一种现代方法,因为如果我没有记错的话,因为最后一个不支持现成的SNI的操作系统是带有IE 6.x的Windows XP。现在你可以看到SAN财产,如果您购买的通配符证书-例如这样的证书*.foobar.com
将包含一个通用名的*.foobar.com
和SAN的foobar.com
。
这是(可能)更易理解的答案:
SNI在客户端进行,并告诉TLS堆栈“我想与名称为[服务器X]的服务器通信”。服务器看到此[Server X]字符串,并使用适当的证书进行答复。一个实际的例子是一台服务器需要为多个域提供流量。如果客户端使用IP(以避免DNS查找延迟),但证书CN未提及IP,这也很有用。
SAN是证书中“也称为”的列表。这样,服务器可以为多个名称使用单个证书。可以将多个域添加到同一证书,甚至可以添加IP列表。
如您所见,事情重叠了。在一个或两个之间进行选择取决于一个人可以控制的地方。某些客户端可能无法识别SAN中的名称,而唯一的寻址方法是通过提供基于SNI的适当证书。在某些情况下,服务器为单个证书提供API,或者客户端不发送SNI。对于这些情况,SAN是唯一的出路。
我公司同时利用了两者。它们提供了灵活性,并使向后和向前的兼容性更容易。