该特定订单的原因是在X.500系列标准中定义了专有名称(DN)。 X.500是关于目录服务。 X.500目录服务器已经大部分被LDAP服务器所取代,但X.509是定义证书的系列的一部分,因其他目的而存活下来。
在目录树中,最常用的节点位于顶部(在您的示例中为国家/地区),然后在树的每个级别上缩小范围。一个人通常在这棵树叶子:
C=US
|
O=Example1 ----- O=Example2
| |
OU=OU1-----OU=OU2 ...
| |
CN=XYZ ...
AFAIK X.500包含了一些规则,定义哪些属性类型可以按照树一定的属性类型,但不幸的是文件不是免费提供的。
在证书的主题或发行者DN的相对识别名(RDN的)上的ASN.1级的顺序反映在树中的顺序(即自上而下):
SEQUENCE {
SET {
SEQUENCE {
OBJECT IDENTIFIER=CountryName (2.5.4.6)
PRINTABLE STRING='US'
}
}
SET {
SEQUENCE {
OBJECT IDENTIFIER=OrganizationName (2.5.4.10)
PRINTABLE STRING='GeoTrust Inc.'
}
}
SET {
SEQUENCE {
OBJECT IDENTIFIER=CommonName (2.5.4.3)
PRINTABLE STRING='GeoTrust Global CA'
}
}
}
然而,对于DN的字符串表示有两个标准:OpenSSL的默认显示的属性,因为他们实际上是存储在证书中,而RFC 2253/4514颠倒顺序:
...输出由RDNS序列中的每个 RelativeDistinguishedName的字符串编码组成(根据第 2.2版),从序列的最后一个元素开始,向后移动到第一个元素。
CN=GeoTrust Global CA,O=GeoTrust Inc.,C=US
还要注意的是有证书,有多个OU在其DNS或更少的公共属性类型从RFC 4519像SERIALNUMBER或UID“在野外”。我也看到了很多证书,其中RDN实际上是按错误顺序编码的。
更具体地说,证书主题中的RDN属性顺序无关紧要。有一个约定,但它没有严格执行,因为虽然主题字段使用X.500名称格式,但它不属于任何X.500树。 – Crypt32
@CryptoGuy我认为它是DER编码的时候很重要,因为我在各种资源中发现了以下引用:“集合中的元素根据其标记值按排序顺序编码”(请纠正我,如果我错了)。然而,你的评论和答案,都帮助我理解为什么这个丑陋的遗留代码可以工作。感谢那! – FranMowinckel
'SET'是一个无序的序列。这意味着嵌套类型(RDN属性)可以以任何顺序出现。这只是一个按照某种特定顺序排列的惯例。 – Crypt32