X500Principal杰出名称顺序

时间:2012-06-03 16:18:39

标签: java bouncycastle x509 distinguishedname

我正在使用Bouncycastle lib使用X509v3CertificateBuilder类从PKCS10请求生成证书。

它返回构建一个X509CertificateHolder对象,该对象包含生成的证书。 如果我在持有者上调用getIssuer,它会以正确的顺序返回发行者专有名称(如果我在发行者证书上调用getSubjectX500Principal(),则返回相同的名称),如果我使用java CertificateFactory解析持有者的编码版本,则getIssuerX500Principal ()生成证书的方法以相反的顺序返回DN,出了什么问题?

以下是我正在尝试做的示例代码:

X509CertificateHolder holder = certBuilder.build(sigGen);
holder.getIssuer(); //Returns the DN in the correct order (same as in issuer cert)

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(holder.getEncoded()));

cert.getIssuerX500Principal().getName(); //Returns issuer DN in reverse order

2 个答案:

答案 0 :(得分:5)

由于我需要比较专有名称,我通过使用LdapName类解析DN并比较解析的rdns来解决:

boolean DNmatches(X500Principal p1, X500Principal p2) {
    List<Rdn> rdn1 = new LdapName(p1.getName()).getRdns();
    List<Rdn> rdn2 = new LdapName(p2.getName()).getRdns();

    if(rdn1.size() != rdn2.size())
        return false;

    return rdn1.containsAll(rdn2);
}

答案 1 :(得分:0)

以防万一有人需要在证书顺序中提取主题 DN,我发现这样做了:

SyntaxNodeAnalysisContext.SemanticModel.SyntaxTree.FilePath