該特定訂單的原因是在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