2010-08-24 6 views
6

Bonjour à tous J'essaie de convertir une clé privée PKCS # 8 que je génère dans mon programme java en un fichier encodé PEM. Après l'exécution du programme, j'ai la clé privée dans les deux formats et une clé publique (le code ne s'affiche pas comme cela fonctionne). J'utilise ensuite cette commande openssl pour convertir la private.key en un fichier pem formated.Convertir une clé privée PKCS # 8 en PEM en java

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

Quand je compare private.pem et private2.pem ils sont différents et, évidemment, lorsque je tente d'utiliser private.pem il dit qu'il est pas un fichier valide.

Quelle étape me manque pour convertir correctement cette clé privée dans le format PEM dont j'ai besoin? Je ne peux pas utiliser OpenSSL depuis mon programme, sinon j'ajouterais simplement cet appel de fonction. J'ai accès aux bibliothèques BouncyCastle dans ce programme, alors peut-être que j'ai une solution que je néglige.

+0

Quel logiciel essayez-vous d'utiliser? (Quand vous dites, "ça dit que ce n'est pas un fichier valide", qu'est-ce que "it"?) – erickson

+0

Curl et OpenSSL disent la même chose quand j'essaie d'utiliser private.key pour diverses opérations. – Hiro2k

+1

missing privatepemWriter.close(); // pour vider correctement. Je vous remercie. –

Répondre

9

Vous pouvez utiliser la classe PEMWriter dans Bouncycastle.

+0

Merci cela a bien fonctionné et j'ai été en mesure d'enlever tout mon code redondant! La lecture du code source m'a aidé à comprendre quels objets passer. http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/openssl/PEMWriter.java.htm – Hiro2k

+2

Oui, la documentation de bouncycastle est mauvaise mais le code source est très facile lire! –

2

Utilisez l'en-tête:

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

& hellip; et le pied de page:

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

Notez que le « RSA » est laissé — Le code Java utilise PKCS # 8 encodage pour la clé privée, et que le codage comprend l'algorithme.

La commande openssl que vous affichez convertit une clé PKCS # 8 standard sous forme DER en une clé OpenSSL propriétaire au format PEM. Pour conserver le format PKCS # 8, mais convertir de DER en PEM, ajoutez l'option -topk8. La sortie OpenSSL doit alors correspondre à ce que votre code Java produit.

Si vous avez besoin de produire la clé OpenSSL, au lieu de PKCS # 8, c'est possible, mais vous devrez créer votre propre structure OpenSSL avec la bibliothèque BouncyCastle ASN.1 et l'encoder. S'il vous plaît clarifier si c'est ce dont vous avez besoin.

+0

Oui, ce que je veux, c'est produire la clé OpenSSL au lieu du PKCS # 8. J'ai regardé le soufflet de PEMWriter, mais je ne sais pas si cela fera ce dont j'ai besoin, compte tenu de la conversion. – Hiro2k

+1

Cela vous ferait-il du mal de l'essayer et de voir? –

5

Le fait que OpenSSL utilise son propre format est vraiment la seule chose qui rend ce défi. Heureusement, le château gonflable PEMWriter rend cela facile, mais l'interface n'est pas très bien documentée. J'ai trouvé du code en cherchant dans la liste de diffusion. Je l'ai adapté ci-dessous:

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

Merci pour l'exemple travaillé. –

Questions connexes