2016-03-30 15 views
0

ich bin in diesem Augenblick vor einem Problem und ich kann nicht verstehen, warum ich nicht einen Schlüsselspeicher auf Java 6. Das Stück Code ist wie folgt lesen:Extrahierung Certficate von Schlüsselspeicher auf Java 6

KeyStore ks = KeyStore.getInstance("jks"); 
FileInputStream file = new FileInputStream(<path to file>); 
ks.load(file, <password>); 
String alias = (String)ks.aliases().nextElement(); 

PrivateKey key = (PrivateKey)ks.getKey(alias, ConstantsUtils.CERT_PASS.toCharArray()); 
Certificate[] chain = ks.getCertificateChain(alias); 

I‘ m Verwenden dieses Zertifikats zum Signieren einer PDF aus Java-Code, aber Variablen Schlüssel und Kette bleiben null, damit der Keystore meinen privaten Schlüssel nicht abrufen kann.

Der Schlüsselspeicher wurde von keytool importiert ein Zertifikat mit der nächsten Zeile (Windows 7) erstellt:

C:\Program Files\Java\jdk1.6.0_37\bin>keytool -importcert -file "<path to cert>" -keystore <path to keystore -alias "<alias>" -keypass <password> -storepass <password> 

importiertes Zertifikat von einer dritten Partei ist, und soll richtig funktionieren. Ich weiß nicht, ob etwas falsch ist, das Zertifikat zu importieren, oder ob ich etwas falsch schreibe.

Antwort

0

Nun, endlich habe ich die ultimative Lösung gefunden.

Mein Problem war, dass ich 2 Dateien hatte, eines ein Zertifikat (wir nennen es certificate.crt) und das andere war der private Schlüssel (wir nennen es private_key.pem). Als EJP sagte zuvor das Problem um den privaten Schlüssel-Import-Prozess. Ich hatte 2 verschiedene Dateien, also importierte ich nur certificate.crt Datei in eine .jks Datei, und private_key.pem gab mir einen Fehler, wenn ich versuchte (offensichtlich) zu importieren. Also meine Lösung beide Dateien zu verschmelzen war (certificate.crt und private_key.pem) in eine PKCS#12 Datei mit diesem Befehl:

openssl pkcs12 -inkey private_key.pem -in certificate.cert -export -out certificate.pfx 

nun der neue certificate.pfx ist ein Schlüsselspeicher, die öffentlichen und privaten Schlüssel enthält, richtig so formatiert, mit einige Änderungen in meinem Code war es möglich, den privaten Schlüssel zu erhalten und mein Dokument zu unterzeichnen:

Also das ist alles. Danke EJP, ich habe dich missverstanden, und du hast mich dazu gebracht, richtig zu denken. Ich war mit diesen vier Tagen konfrontiert, also bin ich jetzt ziemlich überhastet.

2

Sie importieren ein Zertifikat. Es sei denn, es entspricht einem privaten Schlüssel, der sich bereits im KeyStore befindet, und Sie stimmen den CA-Zertifizierungsstellen nicht zu. Wenn Sie dazu aufgefordert werden, wird ein vertrauenswürdiges Zertifikat erstellt, und die Suche nach einem Fehler über PrivateKey schlägt fehl.

Und wenn Sie ein Zertifikat von einer Drittpartei importieren, haben Sie nicht ihren privaten Schlüssel, es sei denn, sie sind spektakulär inkompetent.

Kurz gesagt, was Sie tun, macht keinen Sinn.

+0

Es ist nur ein Zertifikat, um ein PDF-Dokument zu signieren, das zuvor auf Java-Ebene erstellt wurde, ich brauche nur eine Möglichkeit, dieses Dokument zu lesen und auf dieses Dokument zu stempeln. –

+0

Sie können damit nichts signieren, es sei denn, Sie haben einen privaten Schlüssel. Ihr ganzes Problem scheint radikal falsch zu sein. – EJP

+0

Das Ding ist, dass ich das Zertifikat (also den privaten Schlüssel auch) in meinen KeyStore mit keytool importierte, dann möchte ich diesen privaten Schlüssel lesen, um es zu benutzen, um mein PDF zu unterzeichnen. Das Problem ist, dass ich diesen PrivateKey nicht lesen kann, obwohl ich den Keystore öffnen kann und in einem Debugger alle Daten sehen kann. –