SSL - 通用名称(CN)和主题备用名称(SAN)如何协同工作?

时间:2011-05-09 10:07:10

标签: ssl https ssl-certificate

假设SSL证书的使用者备用名称(SAN)属性包含两个DNS名称

  1. domain.tld
  2. host.domain.tld
  3. 但公共名称(CN)仅设置为其中之一:CN=domain.tld

    • 此设置是否具有特殊含义,或者与设置两个CN相比有哪些优势?
    • 如果正在请求另一个host.domain.tld,服务器端会发生什么?

    修改

    正如Eugene的回答最近所了解的那样,行为因实现而异,我想更具体一点: OpenSSL 0.9.8b + 如何处理给定的场景?

3 个答案:

答案 0 :(得分:69)

这取决于实现,但一般规则是针对所有SAN和公用名检查域。如果在那里找到域,则证书可以连接。

RFC 5280,第4.1.2.6节说“主题名称可以在主题字段和/或subjectAltName扩展名中携带”。这意味着必须根据证书的SubjectAltName扩展名和Subject属性(即它的公用名参数)检查域名。这两个地方相互补充,而不是重复。 SubjectAltName是放置其他名称的合适位置,例如 www .domain.com或 www2 .domain.com

更新:根据RFC 6125发布于2011年,验证者必须先检查SAN,如果存在SAN,则不应检查CN。请注意,RFC 6125是相对较新的,并且仍然存在颁发证书的证书和CA,其中包括CN中的“主”域名和SAN中的备用域名。即如果存在SAN,则通过从验证中排除CN,您可以拒绝某些其他有效的证书。

答案 1 :(得分:41)

为了绝对正确,您应该将所有名称都放入SAN字段中。

CN字段应该包含主题名称而不是域名,但是当Netscape发现这个SSL时,他们错过了定义其最大的市场。 只是没有为服务器URL定义证书字段。

这解决了将域放入CN字段,现在不推荐使用CN字段,但仍然广泛使用。 CN只能拥有一个域名。

对此的一般规则: CN - 把你的主要网址放在这里(兼容性) SAN - 把你所有的域放在这里,重复CN,因为它不在那里,但它用于那个......

如果您找到了正确的实施方案,您的问题的答案将如下:

  • 此设置是否具有特殊含义,或者设置两个CN的任何[dis]优势? 你不能设置两个CN,因为CN只能包含一个名称。 您可以使用2个简单的CN证书而不是CN + SAN证书,但是您需要2个IP地址。

  • 如果请求另一个host.domain.tld,服务器端会发生什么? 在服务器端发生的事情并不重要。

简而言之: 当浏览器客户端连接到此服务器时,浏览器会发送加密包,这些包使用服务器的公钥进行加密。服务器解密包,如果服务器可以解密,则为服务器加密。

服务器在解密之前不会从客户端知道任何事情,因为只有IP地址没有通过连接加密。这就是为什么2个证书需要2个IP的原因。 (忘了SNI,现在还有太多的XP了。)

在客户端,浏览器获取CN,然后是SAN,直到检查完所有内容。 如果其中一个名称与该站点匹配,则URL验证由浏览器完成。 (我不是在谈论证书验证,当然很多ocsp,crl,aia请求和答案每次都在网上传播。)

答案 2 :(得分:9)

CABForum基线要求

我看到没有人提到基线要求中的部分。我觉得他们很重要。

问: SSL - 公用名(CN)和主题备用名称(SAN)如何协同工作?
A:完全没有。如果有SAN,则可以忽略CN。 - 至少如果进行检查的软件严格遵守CABForum的基线要求。

(所以这意味着我无法回答你的问题的“编辑”。只有原始问题。)

CABForum Baseline Requirements, v. 1.2.5 (as of 2 April 2015), page 9-10

  

9.2.2主题专有名称字段
  的一个。主题共同名称字段
  证书字段:主题:commonName(OID 2.5.4.3)
  必填/可选:已弃用(不鼓励,但未被禁止)
  内容:如果存在,此字段必须包含单个IP地址或完全限定域名,它是证书subjectAltName扩展中包含的值之一(请参阅第9.2.1节)。

编辑:链接来自@ Bruno的评论

RFC 2818: HTTP over TLS ,2000,Section 3.1: Server Identity

  

如果存在类型为dNSName的subjectAltName扩展名,则必须      用作身份。否则,(最具体的)通用名称      必须使用证书的Subject字段中的字段。虽然      使用Common Name是现有的做法,它已被弃用      鼓励证书颁发机构改为使用dNSName。

RFC 6125: 基于域的应用服务的表示和验证  使用X.509(PKIX)在Internet公钥基础结构中的身份      传输层安全(TLS)背景下的证书,2011,Section 6.4.4: Checking of Common Names

  

[...]当且仅当提供的标识符不包含a      DNS-ID,SRV-ID,URI-ID或任何特定于应用程序的标识符类型      在客户端的支持下,客户端可以作为最后的手段进行检查      对于其表单与完全限定的DNS域的表单匹配的字符串      在主题字段的公共名称字段中的名称(即,CN-ID)。