2012-07-23 5 views
8

Ich versuche Java zu verwenden, um ein Zertifikat zu lesen, das ich von einer externen Partei erhalten habe. Der Code wirft den folgenden Fehler:Ein X.509-Zertifikat mit Java lesen

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

Der Code:

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

Um das Problem stellen Sie sicher, wurde in den Code nicht, ich ein selbst signiertes erstellte Zertifikat und verwendet es mit dem Code, und es hat gut funktioniert. Ich habe beide Zertifikate in der Systemschlüsselkette installiert, und beide sind gültig. Ich benutze einen Mac und Java 1.6.

Irgendeine Idee, warum ich die oben genannte Ausnahme bekomme, wenn ich das externe Parteizertifikat lade? Glaubst du, dass es während der Übertragung beschädigt wurde? Wenn dies der Fall ist, sollte es auf dem lokalen System nicht als gültig angezeigt werden, oder?

+0

Wenn Sie es in einem Texteditor öffnen, zeigt es Text oder Müll? –

+0

Ich habe meins im Texteditor und dessen kompletten Müll geöffnet und die dritte Partei ist ordentlich Müll in BEGIN-Zertifikat und END-Zertifikat-Text und der Inhalt innerhalb dieser beiden Enden mit == (base64 codiert?) – Java

+0

Ordentlich angeordnet wie in '- ---- START ZERTIFIKAT ----- \ n Basis 64 Junk \ n ----- ENDE ZERTIFIKAT ----- "Ich nehme an? –

Antwort

6

Versuchen Sie, diese mit OpenSSL zu geben, und dann das Ergebnis importieren:

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

oder die Java-Hüpfburg Funktionalität in der leichten API verwenden:

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

Sie das Ergebnis kodieren erneut und verwenden Sie dann den standardmäßigen CertificateBuilder in Java, um ein JCE-definiertes Zertifikat zu erhalten.

+0

FWIW, die BouncyCastle Lightweight API gab mir einen sehr ähnlichen Fehler. – cmbaron

+0

Nicht alle Zertifikate sind gleich, @ Cmbaron, ich habe viele Codierungsfehler gesehen. Wenn Sie sicher sind, dass Ihr Code funktionieren sollte (fragen Sie die Bouncy-Mailingliste), kann dies auch Ihr Zertifikat sein. –