2

アプリのさまざまな部分で bouncycastle org.bouncycastle.jce.provider.X509CertificateObject と sun.security.x509.X509CertImpl を使用していますが、それらが等しいかどうかを比較する必要がある場合があり、 equals() メソッドが機能せず、 getSubjectDN のようなメソッドがあります().getName() は、これらの実装ごとに異なる結果を表示します。バイナリ DER または PEM 比較に行かずに、これらの証明書が等しいかどうかを比較するにはどうすればよいですか?

4

3 に答える 3

5

2 つの証明書が等しいかどうかを確認する安全な方法は、それらのバイナリ表現を比較することです。Bouncy Castle と Sun の実装はどちらもgetEncodedメソッドを特徴としています。この 2 つを Arrays#equals で比較できます。

SubjectDN または IssuerDN 文字列を比較することは避けてください。バイナリ レベルでは完全に等しい場合でも、表現が異なる可能性は十分にあります。.NET とやり取りするときは、これを難しい方法で学ばなければなりませんでした。個々の相対識別名 (CN、O、OU など) の命名は、よりエキゾチックな RDN では異なります。私のアドバイスは、比較のためにバイナリレベルにとどまることです.トリッキーな高レベルの比較はエラーが発生しやすく、維持するのが困難です.

于 2011-07-25T02:33:54.593 に答える
1

もう 1 つの方法は、証明書データの MD5 または SHA-1 ハッシュを使用して比較することです。これは、証明書のフィンガープリントが生成される方法であり、2 つが等しいことを保証します。

于 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 に答える