2016-10-03 116 views
3

我正在使用一些遺留代碼,它實現了一個非常基本的X.509解析器。代碼很舊,我無法分發它。X.509標準屬性集合順序

此代碼按順序讀取發行人和主題中的標準屬性集並按特定順序排列。作爲一個基本的例子:

C=XX, O=MyOrganization, OU=MyOrganizationalUnit, 
CN=myCommonName 

所以它會讀取國家,然後是組織,然後是組織單位,最後是通用名稱。

我一直在閱讀標準(https://tools.ietf.org/html/rfc5280#section-4.1.2.4)(參見4.1.2.4和4.1.2.6),並且這些遺留代碼在某種程度上可以與大多數證書一起工作。

問題是,如果這組屬性必須遵循特定的順序,並且它表示如此或相反。

回答

2

該特定訂單的原因是在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實際上是按錯誤順序編碼的。

+1

更具體地說,證書主題中的RDN屬性順序無關緊要。有一個約定,但它沒有嚴格執行,因爲雖然主題字段使用X.500名稱格式,但它不屬於任何X.500樹。 – Crypt32

+0

@CryptoGuy我認爲它是DER編碼的時候很重要,因爲我在各種資源中發現了以下引用:「集合中的元素根據其標記值按排序順序編碼」(請糾正我,如果我錯了)。然而,你的評論和答案,都幫助我理解爲什麼這個醜陋的遺留代碼可以工作。感謝那! – FranMowinckel

+0

'SET'是一個無序的序列。這意味着嵌套類型(RDN屬性)可以以任何順序出現。這只是一個按照某種特定順序排列的慣例。 – Crypt32