X.509标准属性集顺序

时间:2016-10-03 17:25:07

标签: x509

我正在使用一些遗留代码,它实现了一个非常基本的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节),这个遗留代码以某种方式适用于大多数证书。

问题是这组属性是否必须遵循特定的顺序以及它所说的相反或相反的地方。

1 个答案:

答案 0 :(得分:2)

该特定订单的原因是X.500系列标准中定义了专有名称(DN)。 X.500是关于目录服务。 X.500目录服务器主要由LDAP服务器取代,但X.509(定义证书的系列的一部分)已经存活用于其他目的。

在目录树中,最常规的节点位于顶部(在您的示例中为 country ),然后在树的每个级别缩小。一个人通常是这棵树上的一片叶子:

                 C=US
                  |
     O=Example1 ----- O=Example2
          |                |
  OU=OU1-----OU=OU2      ...
    |          |
  CN=XYZ      ...   

AFAIK X.500包含一些规则,用于定义哪种属性类型可以遵循树中的某种属性类型,但遗憾的是文档不是免费提供的。

ASN.1 级别的证书的主题或颁发者DN中的相对可分辨名称(RDN)的顺序反映了树中的顺序(即自上而下):

    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 / {{3颠倒顺序:

  

...输出由每个字符串编码组成      RDNSequence中的RelativeDistinguishedName(根据Section      2.2),从序列的最后一个元素开始并移动      倒向第一个。

CN=GeoTrust Global CA,O=GeoTrust Inc.,C=US

另请注意,存在证书“ in wild ”,其DN中包含多个OU,或4514中不常见的属性类型,如SERIALNUMBER或UID。我还看到了很多证书,其中RDN实际上是以错误的顺序编码的。