2010-08-24 4 views
6

Hallo an alle Ich versuche, einen PKCS # 8 privaten Schlüssel, den ich in meinem Java-Programm generiere, in eine PEM-kodierte Datei zu konvertieren.Konvertieren eines PKCS # 8 privaten Schlüssels zu PEM in Java

Security.addProvider(new BouncyCastleProvider()); 
SecureRandom rand = new SecureRandom(); 
JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();   
keyPairGen.initialize(2048, rand); 
KeyPair keyPair = keyPairGen.generateKeyPair(); 

PEMWriter privatepemWriter = new PEMWriter(new FileWriter(new File(dir + "private.key"))); 
privatepemWriter.writeObject(keyPair.getPrivate()); 

Nach dem Ausführen des Programms habe ich die privaten Schlüssel in beiden Formaten und einen öffentlichen Schlüssel (der Code wie es funktioniert nicht dargestellt ist). Ich benutze dann diesen Befehl openssl, um den Schlüssel "private.key" zurück zu einer Datei mit Pem-Formatierung zu konvertieren.

openssl pkcs8 -nocrypt -inform DER -in private.key -out private2.pem 

Als ich vergleichen private.pem und private2.pem sie sind anders und natürlich, wenn ich versuche, es zu benutzen private.pem sagt, es ist keine gültige Datei.

Welchen Schritt vermisse ich, um diesen privaten Schlüssel richtig in das PEM-Format zu konvertieren, das ich brauche? Ich kann OpenSSL nicht in meinem Programm verwenden, sonst würde ich einfach diesen Funktionsaufruf hinzufügen. Ich habe Zugang zu BouncyCastle-Bibliotheken in diesem Programm, also vielleicht hat es eine Lösung, die ich übersehen habe.

+0

Mit welcher Software versuchen Sie zu interagieren? (Wenn Sie sagen, "es sagt, es ist keine gültige Datei", was ist "es"?) – erickson

+0

Curl und OpenSSL sagen die gleiche Sache, wenn ich versuche, den private.key für verschiedene Operationen zu verwenden. – Hiro2k

+1

fehlt privatepemWriter.close(); // um korrekt zu spülen. Vielen Dank. –

Antwort

9

Sie können die PEMWriter Klasse in Bouncycastle verwenden.

+0

Danke das hat super funktioniert und ich konnte meinen gesamten redundanten Code entfernen! Durch das Lesen des Quellcodes konnte ich herausfinden, welche Objekte übergeben werden müssen. http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/openssl/PEMWriter.java.htm – Hiro2k

+2

Ja, bouncycastle Dokumentation ist schlecht, aber der Quellcode ist sehr einfach lesen! –

2

Verwenden Sie den Header:

-----BEGIN PRIVATE KEY----- 

& hellip; und die Fußzeile:

-----END PRIVATE KEY----- 

Beachten Sie, dass die „RSA“ weggelassen — Der Java-Code PKCS # 8-Codierung für den privaten Schlüssel verwendet, und dass Codierung enthält den Algorithmus.

Der Befehl openssl, den Sie anzeigen, konvertiert einen Standard-PKCS # 8-Schlüssel in der DER-Form in einen proprietären OpenSSL-Schlüssel in PEM-Form. Um das PKCS # 8-Format beizubehalten, aber von DER zu PEM zu konvertieren, fügen Sie die Option -topk8 hinzu. Dann sollte die OpenSSL-Ausgabe mit dem übereinstimmen, was Ihr Java-Code produziert.

Wenn Sie den OpenSSL-Schlüssel anstelle von PKCS # 8 erstellen müssen, ist es möglich, aber Sie müssen Ihre eigene OpenSSL-Struktur mit der BouncyCastle ASN.1-Bibliothek erstellen und diese verschlüsseln. Bitte klären Sie, ob Sie das brauchen.

+0

Ja, was ich will ist, den OpenSSL-Schlüssel anstelle des PKCS # 8 zu produzieren. Ich habe mir den PEMWriter angeschaut, aber ich weiß nicht, ob er das tun wird, was ich brauche, angesichts der Umstellung. – Hiro2k

+1

Würde es dir weh tun, es auszuprobieren und zu sehen? –

5

Die Tatsache, dass OpenSSL ein eigenes Format verwendet, ist wirklich das Einzige, was diese Herausforderung darstellt. Zum Glück macht die Hüpfburg PEMWriter das einfach, aber die Schnittstelle ist nicht sehr gut dokumentiert. Ich habe Code gefunden, indem ich die Mailingliste durchsucht habe. Ich habe es unten angepasst:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(2048); 
KeyPair keyPair = keyGen.generateKeyPair(); 
StringWriter stringWriter = new StringWriter(); 
PEMWriter pemWriter = new PEMWriter(stringWriter); 
pemWriter.writeObject(keyPair.getPrivate()); 
pemWriter.close(); 
privateKeyString = stringWriter.toString(); 
+0

Danke für das ausgearbeitete Beispiel. –