X.509 标准属性集顺序

X.509 Standard set of attributes order

我正在处理一些遗留代码,它实现了一个非常基本的 X.509 解析器。代码太旧了,无法发布

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

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

所以它会读取国家,然后是组织,然后是组织单位,最后是通用名称。

我一直在阅读标准 (https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.4),(请参阅第 4.1.2.4 和 4.1.2.6 节)并且此遗留代码以某种方式适用于大多数证书。

问题是这组属性是否必须遵循特定的顺序,以及它所说的是这样还​​是相反。

该特定顺序的原因是 可分辨名称 (DN) 是在 X.500 系列标准中定义的。 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/4514 颠倒顺序:

... the output consists of the string encodings of each RelativeDistinguishedName in the RDNSequence (according to Section 2.2), starting with the last element of the sequence and moving backwards toward the first.

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

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