【问题标题】:X.509 Standard set of attributes orderX.509 标准属性集顺序
【发布时间】:2016-10-03 17:25:07
【问题描述】:

我正在处理一些遗留代码,它实现了一个非常基本的 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 节)并且这个遗留代码在某种程度上适用于大多数证书。

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

【问题讨论】:

    标签: x509


    【解决方案1】:

    该特定顺序的原因是 专有名称 (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 反转顺序:

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

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

    另请注意,有些证书“在野外”在其 DN 中具有多个 OU,或者来自RFC 4519 的不太常见的属性类型,例如 SERIALNUMBER 或 UID。我也见过不少证书,其中的 RDN 实际上是以错误的顺序编码的。

    【讨论】:

    • 更具体地说,证书主题中的 RDN 属性顺序无关紧要。有一个约定,但没有严格执行,因为尽管主题字段使用 X.500 名称格式,但它不属于任何 X.500 树。
    • @CryptoGuy 我认为当它们被 DER 编码时确实很重要,因为我在各种来源中发现了以下引用:“集合的元素根据它们的标签值按排序顺序编码” (如果我错了,请纠正我)。但是,您的评论和答案都帮助我理解了为什么这个丑陋的遗留代码完全有效。谢谢!
    • SET 是一个无序序列。这意味着嵌套类型(RDN 属性)可以以任何顺序出现。以某种特定顺序对它们进行排序只是一种约定。
    • @CryptoGuy 名称是 RDN 的 SEQUENCE,而不是 SET。 SET 仅与多值 RDN 有关。即便如此,还是有一个命令,因为 - 正如 FranMowinckel 指出的那样 - X.509 证书是 DER 编码的。
    • DER 编码在这里无关紧要,因为它只是编码。感谢您在序列上纠正我,我放弃了。但是,放置 RDN 属性时仍然没有特定的顺序。您可以按此顺序设置名称CN=some name, OU=org unit, O=org 或按此顺序设置名称:OU=org unit, CN=some name, O=org。对于主题字段,它们的含义相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2011-01-07
    • 2013-11-25
    相关资源
    最近更新 更多