2016-10-03 86 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