多个组织单位 (OU) ASN.1 编码差异

Multiple Organizational Units (OU) ASN.1 encoding differences

我遇到过两种不同的编码多个 OU 的方法。 一种是将多个OU与其他标识符同级列出,如

SEQUENCE {
   SET {
     SEQUENCE {
       OBJECT IDENTIFIER commonName (2 5 4 3)
       PrintableString 'tester'
       }
     }
   SET {
     SEQUENCE {
       OBJECT IDENTIFIER organizationalUnitName (2 5 4 11)
       UTF8String 'department1'
       }
     }
   SET {
     SEQUENCE {
       OBJECT IDENTIFIER organizationalUnitName (2 5 4 11)
       UTF8String 'org1'
       }
     }
}

另一种是将 OU 作为列表嵌入如下

SEQUENCE {
   SET {
     SEQUENCE {
       OBJECT IDENTIFIER commonName (2 5 4 3)
       PrintableString 'tester'
       }
     }
   SET {
     SEQUENCE {
       OBJECT IDENTIFIER organizationalUnitName (2 5 4 11)
       PrintableString 'department1'
       }
     SEQUENCE {
       OBJECT IDENTIFIER organizationalUnitName (2 5 4 11)
       PrintableString 'org1'
       }
     }
}

有些工具会将第二个编码解码为仅 1 个 OU,表示如下

organizationalUnitName    = department1 + organizationalUnitName    = org1

我只是想知道哪种方式对多个 OU 进行编码更好或更常见。

在第一个编码中(SET 仅嵌套一个 SEQUENCE),RDN 属性 printed/decoded 与编码时的顺序完全相同:

OU=org1, OU=department1, CN=tester

在第二个示例中(SET 嵌套多个 SEQUENCE),单个 SET 中的 RDN 属性可以重新排序,并可能导致两条路径:

OU=org1, OU=department1, CN=tester
OU=department1, OU=org1, CN=tester

而且这两条路径不一样。这是因为 SET 是一个无序列表,应用程序可以按它们 need/want 的顺序自由排序。因此,我建议使用第一种编码,即 SET 中只有一个 SEQUENCE。这保证 X.500 名称在所有符合规范的实现中产生相同的路径。

p.s。我刚刚使用 Microsoft X.500 解码器实现对此进行了测试。它不会 re-ordrer SET 内的多个 SEQUENCE,并且会按照 RDN 编码的确切顺序进行解码,即 OU=org1, OU=department1, CN=tester

p.p.s。请记住,RDN 应从树根向下编码到叶节点。您的编码是相反的,可能会导致不需要的字符串。