如何比较java.security.cert.X509Certificate的不同实现

时间:2011-07-23 18:28:46

标签: java bouncycastle x509 pki

我在我的应用程序的不同部分使用bouncycastle org.bouncycastle.jce.provider.X509CertificateObject和sun.security.x509.X509CertImpl,有时我需要比较它们是否相等,equals()方法不起作用,像getSubjectDN()。getName()这样的方法为每个实现显示不同的结果,如何在不进行二进制DER或PEM比较的情况下比较这些证书的相等性?

3 个答案:

答案 0 :(得分:5)

判断两个证书是否相等的一种安全方法是比较它们的二进制表示。 Bouncy Castle和Sun的实现都采用getEncoded方法。您可以将两者与Arrays#equals进行比较。

您应该避免比较SubjectDN或IssuerDN字符串,即使在二进制级别它们完全相同,表示也很可能不同。在与.NET连接时,我必须学习这一点 - 单个相对可分辨名称(例如CN,O,OU ...)的命名对于更奇特的RDN是不同的。我的建议是保持二进制级别进行比较,棘手的高级别比较容易出错且难以维护。

答案 1 :(得分:1)

另一种方法是使用证书数据的MD5或SHA-1哈希进行比较。这就是证书指纹的生成方式,并且可以保证两者的相等性。

答案 2 :(得分:0)

您可以尝试将此案例客户端(BouncyCastle)中的证书转换为java.security

try {
            byte[] encoded = client.getEncoded();
            ByteArrayInputStream bis = new ByteArrayInputStream(encoded);
            java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509");
            x509CertificateC = (java.security.cert.X509Certificate) cf.generateCertificate(bis);
        } catch (java.security.cert.CertificateEncodingException e) {
        } catch (java.security.cert.CertificateException e) {
        }