我遇到了两种不同的编码多个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应从树根到叶节点进行编码。您的编码相反,可能会导致不需要的字符串。