5

我正在使用 Bouncycastle 库使用 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
4

2 回答 2

7

由于我需要比较专有名称,我通过使用 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);
}
于 2012-06-06T14:20:37.787 回答
0

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

String certSubject = new JcaX509CertificateHolder(x509Certificate).getSubject().toString();
于 2021-04-08T16:29:07.033 回答