2014-07-01 12 views
5

Próbuję zapisać klucz prywatny w pliku PEM, chroniony hasłem. Problem polega na tym, że plik pem jest tworzony i i może go nawet otworzyć za pomocą openssl, ale nie jest wymagane hasło!JAVA: Jak zapisać klucz prywatny w pliku PEM z ochroną hasłem

Oto kod:

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

Po to wykonuje, próbuję otworzyć plik pk.pem

openssl rsa -in pk.pem -check 

i daje:

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

Został przypuszczać poprosić o hasło przed udzieleniem dostępu do klucza prywatnego! Czy ktoś może mi pomóc?

Odpowiedz

6

Należy uważnie przeczytać dokumentację BouncyCastle. Stwierdza dla konstruktora użyć:

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

Stąd używasz konstruktora do tworzenia tworzy instancję PKCS8Generator niezaszyfrowane. Hasło ustawione jako brak efektu.

Zamiast tego użyj jednego z innych konstruktorów, który utworzy instancję szyfrującą zgodnie z dokumentacją.

Uwaga: Kod w pytaniu wymaga nieaktualnej wersji BouncyCastle (1.4x?), Ponieważ obecna wersja (1.5x) ma różnych konstruktorów, niezgodnych z tymi przedstawionymi w tej odpowiedzi.


Dla nowszych wersjach użyć:

import org.bouncycastle.openssl.jcajce.JcaPEMWriter; 

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

ewentualnie zastępując PrintWriter z jakimkolwiek innym Writer oczywiście.

+0

Dziękuję bardzo! Nie wiedziałem o tym ... i nie wiedziałem też, że używam przestarzałej wersji BC. Ponownie dziękuję. – Snox

+0

Aktualizowanie odpowiedzi, mam wystarczająco dużo rep :) –