5

Bouncycastle libを使用して、X509v3CertificateBuilderクラスを使用してPKCS10要求から証明書を生成しています。

生成された証明書を含むX509CertificateHolderオブジェクトのビルドを返します。ホルダーでgetIssuerを呼び出すと、発行者の識別名が正しい順序で返されます(発行者証明書でgetSubjectX500Principal()を呼び出した場合も同じです)。JavaCertificateFactory、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

識別名を比較する必要があるため、DNをLdapNameクラスで解析し、解析された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 に答える