2

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

4

3 回答 3

5

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

您应该避免比较 SubjectDN 或 IssuerDN 字符串,即使在二进制级别上它们完全相等,表示也很可能不同。在与 .NET 交互时,我必须以一种艰难的方式学习这一点——对于更奇特的 RDN,各个相对专有名称(例如 CN、O、OU ...)的命名是不同的。我的建议是留在二进制级别进行比较,棘手的高级比较容易出错且难以维护。

于 2011-07-25T02:33:54.593 回答
1

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

于 2011-07-26T17:18:34.360 回答
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) {
        }
于 2015-01-15T06:52:03.053 回答