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

  • 本文关键字:ASN 编码 OU 单位 x509 asn.1 ou
  • 更新时间 :
  • 英文 :


我遇到了两种不同的编码多个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属性按编码时的确切顺序打印/解码:

OU=org1, OU=department1, CN=tester

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

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

这两条路是不一样的。这是因为SET是一个无序列表,应用程序可以根据需要/需要自由排序。因此,我建议使用第一个编码,即SET中只有一个SEQUENCE。这保证了X.500名称在所有一致的实现中都会产生相同的路径。

附言:我刚刚用微软的X.500解码器进行了测试。它不会在SET内重新排列多个序列,并在编码RDN时按精确顺序解码,即OU=org1, OU=department1, CN=tester

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

最新更新