2014-07-01 14 views
5

Ich versuche, einen privaten Schlüssel in einer Pem-Datei zu speichern, mit einem Passwort geschützt. Das Problem ist, die PEM-Datei wird erstellt und ich kann sie sogar mit openssl öffnen, aber es wird kein Passwort verlangt! HierJAVA: So speichern Sie einen privaten Schlüssel in einer Pem-Datei mit Passwortschutz

ist der Code:

 KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); 
     keygen.initialize(2048); 
     KeyPair keypair = keygen.generateKeyPair(); 

     PrivateKey privKey = keypair.getPrivate(); 

     PKCS8Generator encryptorBuilder = new PKCS8Generator(privKey); 
     encryptorBuilder.setPassword("testing".toCharArray()); 
     PEMWriter writer = new PEMWriter(new FileWriter(new File("pk.pem"))); 
     PemObject obj = encryptorBuilder.generate(); 

     writer.writeObject(obj); 
     writer.flush(); 
     writer.close(); 

Nachdem er ausgeführt wird, ich versuche, die pk.pem Datei zu öffnen

openssl rsa -in pk.pem -check 

und es gibt:

RSA key ok 
writing RSA key 
-----BEGIN RSA PRIVATE KEY----- 
(... some key appears here ...) 
-----END RSA PRIVATE KEY----- 

Es war wohl vor dem Zugriff auf den privaten Schlüssel nach dem Passwort fragen! Kann mir bitte jemand helfen?

Antwort

6

Nun, Sie sollten die BouncyCastle-Dokumentation sorgfältig lesen. Darin heißt es für den Konstruktor Sie verwenden:

// Constructor for an unencrypted private key PEM object. 
PKCS8Generator(java.security.PrivateKey key) 

// Constructor for an encrypted private key PEM object. 
PKCS8Generator(java.security.PrivateKey key, java.lang.String algorithm, java.lang.String provider) 

Damit Sie den Konstruktor verwenden für das Erstellen einer eine unverschlüsselte PKCS8Generator Instanz erstellt. Das Passwort, das Sie als keinen Effekt festlegen.

Verwenden Sie stattdessen einen der anderen Konstruktoren, die gemäß der Dokumentation eine Verschlüsselungsinstanz erstellen.

Hinweis: Der Code in der Frage erfordert eine veraltete Version von BouncyCastle (1.4x?), Da die aktuelle Version (1.5x) verschiedene Konstruktoren hat, die mit den in dieser Antwort dargestellten nicht kompatibel sind.


Für neuere Versionen verwenden:

import org.bouncycastle.openssl.jcajce.JcaPEMWriter; 

JcaPEMWriter writer = new JcaPEMWriter(new PrintWriter(System.out)); 
writer.writeObject(sk); 
writer.close(); 

möglicherweise die PrintWriter mit jedem anderen Writer natürlich ersetzen.

+0

Vielen Dank! Das wusste ich nicht ... und ich wusste auch nicht, dass ich eine veraltete BC-Version verwende. Nochmals vielen Dank. – Snox

+0

Aktualisierung der Antwort, ich habe sowieso genug rep :) –

Verwandte Themen