2011-07-23 11 views
2

私のアプリケーションのさまざまな部分でbouncycastle org.bouncycastle.jce.provider.X509CertificateObjectとsun.security.x509.X509CertImplを使用しています。 equals()メソッドが機能していないこと、equals()メソッドが機能していないこと、getSubjectDN()。getName()などのメソッドがこれらの実装ごとに異なる結果を表示していることを示しています。java.security.cert.X509Certificateの別個の実装を比較する方法

答えて

5

2つの証明書が等しいかどうかを判断する安全な方法は、そのバイナリ表現を比較することです。 Bouncy CastleとSunの実装の両方にはgetEncodedメソッドがあります。 2つを配列#equalsと比較することができます。

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

+0

をするjava.securityするために、この場合のクライアント(はBouncyCastle)に証明書を変換しようとすることができます)は、比較するとき、私は間違った参照を取得して働いていませんでしたequals()はうまく動作し、バイナリ比較を使用します。ありがとうございました。 –

+0

私は、彼らがマッチすると思うものがあると思います...私はエンコードに行きたくはありませんでしたが、かなり信頼できるようです。試してみよう。 –

+0

@NoProblemBabe DERエンコードされたX.509証明書が正しく実装されていれば、使用しているライブラリにかかわらず、あいまいさの余地はありません。 – emboss

1

もう1つの方法は、証明書データのMD5またはSHA-1ハッシュを使用して比較することです。これは、証明書の指紋がどのように生成されるかを示し、両者の平等性を保証します。

+0

しかし、それはバイト[]比較よりも時間がかかりませんか?お尻や何かにしようとしない...ちょうど尋ねる... –

+0

しかし、比較の非常に巧妙な方法です、私はああを与えるでしょう –

+0

@ NoProblemBabe一度だけ行うと、それは時間がかかるし、あなたに何の利益も与えませんバイトを直接比較します。しかし、多くの証明書を何度も比較すると非常に便利です。次に、ハッシュを作成するための最初のコストは、証明書全体ではなく、20万バイト(SHA-1)を比較する必要があるだけで、数千分の1を比較する必要があります。 – emboss

0

あなたはそれは(等しい伝えるために私の誤りでした

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) { 
     }