2012-07-23 18 views
8

私は外部から受け取った証明書をJavaで読み取ろうとしています。コードは次のエラーを投げている:JavaでX.509証明書を読む

java.lang.RuntimeException: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

コード:

FileInputStream ksfis = new FileInputStream(this.getCertificateFile()); 
ksbufin = new BufferedInputStream(ksfis); 
certificate = (X509Certificate) 
    CertificateFactory.getInstance("X.509").generateCertificate(ksbufin); 

は問題がコードで、私は自己署名証明書を作成したコードとそれを使用していなかったことを確認するには、それはうまくいった。私は両方の証明書をシステムキーチェーンにインストールしており、どちらも有効です。私はMacとJava 1.6を使用しています。

外部パーティ証明書を読み込む際に上記の例外が発生する理由は何ですか?転送中に破損していると思いますか?もしそうなら、それはローカルシステム上で有効ではないはずですか?

+0

テキストエディタで開くと、テキストまたはゴミが表示されますか? –

+0

私はテキストエディタに私の鉱山を開いて、その完全なガーベッジと第三者がBEGIN証明書とEND証明書のテキスト内にきちんと並べられています。これらの両端の内容は==(base64 encoded?) – Java

+0

- ---- START CERTIFICATE ----- \ n base 64 junk \ n ----- END CERTIFICATE ----- '私は推測しますか? –

答えて

6

することは、この使用してOpenSSLを入力してみて、その結果をインポートします。

openssl x509 -outform der -in certificate.pem -out certificate.der 

または軽量のAPIでJava弾む城の機能を使用します。

http://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/openssl/PEMReader.html

あなたは結果を符号化することができますもう一度JavaのデフォルトのCertificateBuilderを使用してJCE定義の証明書を取得します。

+0

FWIW、BouncyCastle軽量APIは私に非常に似たエラーをもたらしました。 – cmbaron

+0

すべての証明書が等しく作成されているわけではありません。@ cmbaron、私は多くのエンコーディングエラーを見てきました。あなたのコードがうまくいくことが確かであれば(Bouncyメーリングリストに尋ねてください)、あなたの証明書にもなります。 –

関連する問題