有人能以简单的方式向我解释这些证书之间的区别吗? 我读了一些文章,但听起来像他们做同样的工作,即用一个证书encryption许多域。
SAN (主题备用名称)是X509证书规范的一部分,其中证书的字段中包含对主题(除了单个通用名称/ CN之外)也有效的备用名称列表。 这个字段和通配符名称实质上是将多个名称使用一个证书的两种方式。
SNI (服务器名称指示)是一种TLS协议扩展 ,其types与HTTP主机头相当。 当客户端发送这个消息时,它允许服务器select合适的证书来呈现给客户端,而不受在服务器端使用单独的IP地址的限制(很像HTTP主机头被严重用于普通的HTTP)。
请注意,SNI不是证书中所反映的,它实际上与问题所要求的相反。 它简化了许多证书,而不是为许多事情使用一个证书。
另一方面,这在很大程度上取决于哪条路线实际上是可取的。 举个例子,如果你需要不同实体的证书,这个问题几乎可以肯定不是你真正想要的。
SAN代表主题备用名称 ,它是x509证书属性, SNI是SSL / TLS客户端可以支持的function,因此是完全不同的实体。
对SAN使用证书,即使客户端不支持SNI,也可以在一个IP地址上托pipe多个支持HTTPS的站点。 在这种情况下,您为所有站点持有一个证书,并且此类证书必须包含所有站点名称( ServerName
或ServerAlias
es在apache坐标中,或server_name
在nginx中),因为它是SAN 。 这是传统方法的一个子集,它扩展了“在每个单独的IP地址上启用一个支持HTTPS的站点”。 目前只有大型CDN坚持使用SAN 。
使用SNI,您还可以在一个IP上托pipe多个支持HTTPS的站点,您为每个站点持有单独的x509证书,这些站点都不会在其SAN属性中提及其他站点名称,但TLS客户端(即浏览器和控制台客户端,如wget
或curl
)必须支持SNI 。 这是一个现代化的方法,因为如果我没有记错的话,最后一个不支持SNI的操作系统是带有IE 6.x的Windows XP。 现在,如果您购买通配符证书,则可以看到SAN属性 – 例如*.foobar.com
这样的证书将包含*.foobar.com
的通用名称和foobar.com
的SAN 。
这混合了证书过程的两个部分。
SAN是主题的替代名称。 这是为多个域创build一个证书的一种方法。 您只需将证书所需的其他域添加到证书中的SAN字段即可。 浏览器也会接受这些域的有效性。
SNI是服务器名称指示,是SSL的一部分。 它允许您在单个IP上托pipe多个SSL站点,因为所需的服务器名称是使用SSL握手发送的,服务器可以为答案select正确的证书。
这里(可能)更人性化的答案:
SNI是在客户端进行的,并告诉TLS协议栈“我想和一个名字是[Server X]的服务器通话”。 服务器看到这个[Server X]string,并用适当的证书答复。 一个实际的例子是单个服务器需要为多个域提供stream量。 如果客户端使用IP(以避免DNS查找延迟),但是证书CN不提及IP,这也很有用。
SAN是证书中的“也称为”的列表。 这样服务器可以为许多名称使用单个证书。 可以将许多域添加到相同的证书,甚至是一个IP列表。
正如你所看到的,事情重叠。 一个或两个之间的select取决于哪里有控制权。 某些客户端可能无法识别SAN中的名称,解决该问题的唯一方法是通过提供基于SNI的适当证书。 有服务器为单个证书提供API的情况,或者客户端不发送SNI。 对于这些情况,SAN是唯一的出路。
我的公司利用这两个。 它们提供了灵活性,使后向兼容性更容易。