x509 - X.509 标准属性集顺序

标签 x509

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

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

最佳答案

该特定顺序的原因是 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 包含一些规则,定义哪些属性类型可以遵循树中的某个属性类型,但不幸的是,这些文档不是免费提供的。

ASN.1 级别证书的主体或颁发者 DN 中相对专有名称 (RDN) 的顺序反射(reflect)了树中的顺序(即自上而下):

    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 中不太常见的属性类型。例如序列号或 UID。我还看到过不少证书,其中 RDN 实际上是以错误的顺序进行编码的。

关于x509 - X.509 标准属性集顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837102/

相关文章:

.net - CryptographicException 'Keyset does not exist' ,但只能通过 WCF

c# - 使用 Pkcs10CertificationRequest 获取主题备用名称

c - 用于CMS/X.509操作的C库

openssl - 如何在 OpenSSL 中指定 x509 配置属性的数据类型

c - 使用 OpenSSL 的基于 X.509 证书的身份验证(不使用套接字)

c# - 如何从签名的 C# exe 中读取公钥

python - 如何在python中修改PEM格式证书的签名

docker - IdentityServer4:如何在 Docker 中从 Cert Store 加载签名凭据

security - 是否有可能将服务器证书复制到攻击者的服务器上以进行滥用?

java - 如何在 java 中解码 .csr 文件以提取其内容