Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何比较java.security.cert.X509Certificate的不同实现_Java_Bouncycastle_X509_Pki - Fatal编程技术网

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

如何比较java.security.cert.X509Certificate的不同实现,java,bouncycastle,x509,pki,Java,Bouncycastle,X509,Pki,我在应用程序的不同部分使用bouncycastle org.bouncycastle.jce.provider.X509CertificateObject和sun.security.x509.X509CertImpl,有时我需要比较它们是否相等,equals()方法不起作用,getSubjectDN()等方法显示的结果也不同,如何在不进行二进制DER或PEM比较的情况下比较这些证书的相等性?判断两个证书是否相等的安全方法是比较它们的二进制表示形式。Bouncy Castle和Sun的实现都有一个

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

判断两个证书是否相等的安全方法是比较它们的二进制表示形式。Bouncy Castle和Sun的实现都有一个
getEncoded
方法。你可以用数组#equals来比较两者


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

另一种方法是使用MD5或SHA-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) {
        }

告诉我equals()不起作用是我的错误,我在比较equals()时得到了错误的引用,正如你所建议的,它使用二进制比较。谢谢你。我认为他们的机会是千载难逢的。。。我不想去,但似乎很信任。我要试试。@NoProblemBabe它比人们想象的更有效;)不,但老实说,在它下面都是DER编码的X.509证书,如果实现正确,无论您使用的是哪个库,都不会有歧义。但这难道不会比字节[]比较花费更多的时间吗?不是想当个混蛋什么的。。。只是问…但这是一个非常聪明的比较方式,我会给你that@NoProblemBabe如果只做一次,它将花费更长的时间,并且与直接比较字节相比不会给您带来任何好处。但是,如果您碰巧多次比较了许多证书,那么它会非常有用。然后,创建散列的初始成本将被以下事实所抵消:您只需要对整个证书比较20个字节(SHA-1),而不是数千个字节。如果您担心生成SHA-1散列的开销,那么您可以验证这两个证书(以确保它们没有被篡改)然后获取bot的字节[]签名并进行比较。最后,这与执行SHA-1哈希和比较非常相似。