X.509 标准属性集顺序

Fra*_*kel 5 x509

我正在使用一些遗留代码,它们实现了一个非常基本的 X.509 解析器。该代码很旧,我无法分发它。

此代码按顺序并按特定顺序读取发行者和主题中的标准属性集。作为一个基本示例:

C=XX, O=MyOrganization, OU=MyOrganizationalUnit,
CN=myCommonName
Run Code Online (Sandbox Code Playgroud)

因此,它会读取国家/地区,然后是组织,然后是组织单位,最后是通用名称。

我一直在阅读标准(https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.4),(参见第4.1.2.4节和4.1.2.6节),这个遗留代码在某种程度上适用于大多数证书。

问题是这组属性是否必须遵循特定的顺序以及它在哪里这么说或相反。

Omi*_*ron 4

采用该特定顺序的原因是X.500系列标准中定义了可分辨名称(DN)。X.500 是关于目录服务的。X.500 目录服务器大部分已被 LDAP 服务器取代,但 X.509(该系列中定义证书的部分)仍用于其他目的。

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

                 C=US
                  |
     O=Example1 ----- O=Example2
          |                |
  OU=OU1-----OU=OU2      ...
    |          |
  CN=XYZ      ...   
Run Code Online (Sandbox Code Playgroud)

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'
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,对于DN 的字符串表示形式,有两个标准:OpenSSL 默认显示属性,因为它们实际存储在证书中,而 RFC 2253 / 4514则相反:

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

CN=GeoTrust Global CA,O=GeoTrust Inc.,C=US
Run Code Online (Sandbox Code Playgroud)

另请注意,存在“野外”证书,其 DN 中有多个 OU 或RFC 4519中不太常见的属性类型(如 SERIALNUMBER 或 UID)。我还看到过不少证书,其中 RDN 实际上是以错误的顺序编码的。