【问题标题】:how to compare distinct implementations of java.security.cert.X509Certificate如何比较 java.security.cert.X509Certificate 的不同实现
【发布时间】:2011-10-11 18:12:35
【问题描述】:

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

【问题讨论】:

    标签: java bouncycastle x509 pki


    【解决方案1】:

    您可以尝试将本例客户端(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) {
            }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但这不能比 byte[] 比较花费更多的时间吗?不是想成为一个混蛋或任何东西......只是问......
      • 但这是一种非常聪明的比较方式,我会告诉你的
      • @NoProblemBabe 如果只做一次它会花费更长的时间,并且与直接比较字节相比不会给您带来任何好处。但是,如果您碰巧多次比较大量证书,它会非常有用。然后,创建哈希的初始成本将被您只需要比较 20 个字节 (SHA-1) 而不是可能的数千个整个证书的事实所抵消。
      • 如果您担心生成 SHA-1 哈希的开销,那么您可以验证两个证书(以确保它们没有被篡改)然后获取字节 []机器人的签名和比较。归根结底,这与执行 SHA-1 哈希和比较非常相似。
      【解决方案3】:

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

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

      【讨论】:

      • 我的错误是告诉 equals() 没有工作我在比较时得到了错误的引用,equals() 工作,并且它使用二进制比较,正如你所建议的那样。谢谢。
      • 我认为他们匹配的机会是千千万万个......我不想去编码,但似乎很信任。会试一试的。
      • @NoProblemBabe 它的工作频率比人们想象的要高 ;) 不,但老实说,在它下面都是 DER 编码的 X.509 证书,如果实施得当,无论图书馆如何,都没有歧义的余地你正在使用。
      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      相关资源
      最近更新 更多