2014-07-01 17 views
5

Sto tentando di salvare una chiave privata in un file PEM, protetta con una password. Il problema è che il file pem è stato creato e io posso persino aprirlo con openssl ma, nessuna password viene richiesta!JAVA: Come salvare una chiave privata in un file PEM con protezione tramite password

Ecco il codice:

 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(); 

dopo aver eseguito, provo ad aprire il file pk.pem

openssl rsa -in pk.pem -check 

e dà:

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

E 'stato supponiamo chiedere la password prima di dare accesso alla chiave privata! Qualcuno può aiutarmi?

risposta

6

Bene, dovresti leggere attentamente la documentazione di BouncyCastle. Essa afferma per il costruttore si utilizza:

// 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) 

Quindi si utilizza la funzione di costruzione per la creazione di un crea un'istanza PKCS8Generator in chiaro. La password che hai impostato come nessun effetto.

Utilizzare invece uno degli altri costruttori che crea un'istanza di crittografia in base alla documentazione.

Nota: il codice nella domanda richiede una versione obsoleta di BouncyCastle (1.4x?), Poiché la versione corrente (1.5x) ha costruttori diversi, incompatibili con quelli presentati in questa risposta.


Per le versioni più recenti utilizzano:

import org.bouncycastle.openssl.jcajce.JcaPEMWriter; 

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

eventualmente sostituendo il PrintWriter con qualsiasi altro Writer naturalmente.

+0

Grazie mille! Non lo sapevo ... e non sapevo nemmeno che stavo usando una versione BC obsoleta. Grazie ancora. – Snox

+0

Aggiornamento della risposta, ho comunque abbastanza rep :) –

Problemi correlati