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

Jür*_*len 69 ssl https ssl-certificate

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

  1. domain.tld
  2. host.domain.tld

但公共名称(CN)仅设置为两者之一:CN=domain.tld.

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

编辑:

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

Eug*_*its 75

这取决于实现,但一般规则是针对所有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,您可以拒绝一些其他有效的证书.

  • 现在正式,Chrome 将不再检查 CN 属性。我的想法是,这些字段可能应该更好地匹配证书中的功能。https://www.chromestatus.com/feature/4981025180483584 (5认同)
  • 如果你正在处理IE,如果subjectAltName存在,它似乎忽略了CN.我已经看到IE10和IE8都抱怨在这种情况下名称不匹配. (3认同)
  • 这与SSL证书有关.有关详细信息,请参阅[this](http://stackoverflow.com/a/25971071/918406)答案.TL; DR RFC 5280仅适用于PKI结构.RFC2818和RFC5216(用于HTTPS)声明如果存在SAN,则必须将其用于标识. (3认同)
  • @Eugene Mayevski'EldoS Corp是的抱歉RFC5216不适用于HTTPS,让他们感到困惑.无论Chrome现在都会抛出ERR_CERT_COMMON_NAME_INVALID错误,因为它只使用SAN(如果存在). (3认同)
  • 这种情况一般都是短路吗?我的意思是,SAN 总是首先检查,如果找到,CN 根本不会被检查? (2认同)

小智 41

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

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

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

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

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

  • 这个设置是否具有特殊含义,或者与设置两个CN相比有什么优势?你不能设置两个CN,因为CN只能包含一个名称.您可以使用2个简单的CN证书而不是CN + SAN证书,但是您需要2个IP地址.

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

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

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

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


Sta*_*uff 10

CABForum基线要求

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

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

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

CABForum基线要求,v.1.2.5(截至2015年4月2日),第9-10页:

9.2.2主题专有名称字段
a.主题公共名称字段
证书字段: subject:commonName(OID 2.5.4.3)
必需/可选:不推荐使用(不鼓励,但不禁止)
内容:如果存在,此字段必须包含单个IP地址或完全限定域名,即一个证书的subjectAltName扩展中包含的值的值(参见第9.2.1节).

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

RFC 2818: HTTP Over TLS,2000,第3.1节:服务器标识:

如果存在类型为dNSName的subjectAltName扩展名,则必须将其用作标识.否则,必须使用证书的Subject字段中的(最具体的)Common Name字段.尽管使用Common Name是现有做法,但不推荐使用它,并且鼓励证书颁发机构使用dNSName.

RFC 6125: 使用传输层安全(TLS)上下文中的X.509(PKIX)证书,Internet公钥基础结构中基于域的应用程序服务标识的表示和验证,2011,第6.4.4节:检查公共名称:

[...]当且仅当所呈现的标识符不包括DNS-ID,SRV-ID,URI-ID或客户端支持的任何特定于应用程序的标识符类型时,客户端可以作为最后的手段检查一个字符串,其形式与主题字段的公共名称字段中的完全限定DNS域名的形式匹配(即,CN-ID).

  • 此CABForum基线要求规则在技术上不是很有用.它只是告诉你在CN中放入什么,但它肯定并不意味着CN无论如何都要用于验证.将CN作为SAN之一是有意义的,但这对于工具和管理目的(或者过于放松的实现)非常有用.从验证的角度来看,RFC 2818("*如果存在类型dNSName的subjectAltName扩展名,必须用作标识*"),甚至RFC 6125,很大程度上早于该规范,并且该特定规则仍然有效同时. (2认同)