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