web-dev-qa-db-fra.com

Conversion d'un magasin de clés Java au format PEM

J'essaie de convertir un fichier de clés Java en un fichier PEM à l'aide d'applications keytool et openssl. Mais je ne pouvais pas trouver un bon moyen de faire la conversion. Des idées? 

Au lieu de convertir le magasin de clés directement en PEM, j'ai d'abord essayé de créer un fichier PKCS12, puis de le convertir en fichier PEM et en magasin de clés pertinents. Mais je ne pouvais pas établir de connexion en les utilisant. (Notez que j'ai juste besoin d'un fichier PEM et d'un fichier de magasin de clés pour implémenter une connexion sécurisée. Il n'y a pas de restriction comme "Démarrer à partir d'un fichier de magasin de clés Java". :) Donc, le fait de partir d'autres formats est acceptable avec mon cas.)

Mais une méthode de conversion directe de jks en pem est préférable.

116

C'est assez simple, en utilisant au moins jdk6 ... 

 bash $ keytool -keystore foo.jks -genkeypair -alias foo\
 -dname 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU' 
 Entrez le mot de passe du magasin de clés: 
 Ressaisissez le nouveau mot de passe: 
 Entrez le mot de passe de la clé pour 
 (RETURN si identique au mot de passe du magasin de clés): 
 Bash $ keytool -keystore foo.jks -exportcert -alias foo |\
 openssl x509 -inform der -text 
 Entrez le mot de passe du magasin de clés: asdasd 
 Certificat: 
 Les données:
 Version: 3 (0x2) 
 Numéro de série: 1237334757 (0x49c03ae5) 
 Algorithme de signature: dsaWithSHA1 
 Emetteur: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Validité
 Pas avant: 18 mars 00:05:57 2009 GMT 
 Pas après: 16 juin 00:05:57 2009 GMT 
 Objet: C = AU, ST = Victoria, L = Melbourne, CN = foo.exemple.com 
 Subject Public Key Info: 
 Algorithme de clé publique: dsaEncryption 
 Clé publique DSA: 
 pub: 
 00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14: 
 7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7: 
 

 bash $ keytool -importkeystore -srckeystore foo.jks\
 -destkeystore foo.p12\
 -srcstoretype jks\
 -deststoretype pkcs12 
 Entrez le mot de passe du magasin de clés de destination: 
 Ressaisissez le nouveau mot de passe: 
 Entrez le mot de passe du magasin de clés source: 
 Entrée de l'alias foo importé avec succès. 0 entrées ont échoué ou ont été annulées 

 Bash $ openssl pkcs12 -in foo.p12 -out foo.pem 
 Entrez le mot de passe d'importation: 
 MAC vérifié OK 
 Entrez le mot de passe PEM:. - Entrez la phrase de passe PEM: 

 Bash $ openssl x509 -text -in foo.pem 
 Certificat: 
 Les données:
 Version: 3 (0x2) 
 Numéro de série: 1237334757 (0x49c03ae5) 
 Algorithme de signature: dsaWithSHA1 
 Emetteur: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Validité
 Pas avant: 18 mars 00:05:57 2009 GMT 
 Pas après: 16 juin 00:05:57 2009 GMT 
 Objet: C = AU, ST = Victoria, L = Melbourne, CN = foo.exemple.com 
 Subject Public Key Info: 
 Algorithme de clé publique: dsaEncryption 
 Clé publique DSA: 
 pub: 
 00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14: 
 7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7: 
 

 bash $ openssl dsa -text -in foo.pem
read DSA key 
 Entrez la phrase secrète PEM: 
 Private-Key: (1024 bit) 
 priv: 
 00: 8f: b1: af: 55: 63: 92: 7c: d2: 0f: e6: f3: a2: f5: ff: 
 1a: 7a: fe: 8c: 39: dd 
 Pub: 
 00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14: 
 7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:.

Vous vous retrouvez avec:

  • foo.jks - magasin de clés au format Java.
  • foo.p12 - magasin de clés au format PKCS # 12.
  • foo.pem - toutes les clés et tous les certificats du magasin de clés, au format PEM.

(Ce dernier fichier peut être divisé en clés et certificats si vous le souhaitez.)


Résumé de la commande - pour créer le magasin de clés JKS:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Résumé de la commande - pour convertir le magasin de clés JKS en magasin de clés PKCS # 12, puis en fichier PEM:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

si vous avez plusieurs certificats dans votre magasin de clés JKS et que vous souhaitez uniquement exporter le certificat et la clé associés à l'un des alias, vous pouvez utiliser la variante suivante:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Résumé de la commande - pour comparer le magasin de clés JKS au fichier PEM:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem
194
Stobor

J'ai gardé des erreurs de openssl lors de l'utilisation de la commande StoBor:

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

Pour une raison quelconque, seul ce style de commande fonctionnerait pour mon fichier JKS

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

La clé définissait destkeypass, la valeur de l'argument importait peu.

29
cmcginty

La commande keytool ne vous permettra pas d'exporter la clé privée à partir d'un magasin de clés. Pour ce faire, vous devez écrire du code Java. Ouvrez le magasin de clés, obtenez la clé dont vous avez besoin et enregistrez-la dans un fichier au format PKCS # 8. Enregistrez également le certificat associé.

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

Utilisez les utilitaires OpenSSL pour convertir ces fichiers (au format binaire) au format PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem
13
erickson

Conversion directe de jks en fichier pem à l'aide de l'outil keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
12
sanghaviss

Instructions simplifiées pour convertir un fichier JKS au format PEM et KEY (.crt & .key):

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>
6
asami

J'ai trouvé une solution très intéressante:

http://www.swview.org/node/191

Ensuite, j'ai divisé la paire clé publique/clé privée en deux fichiers private.key publi.pem et cela fonctionne!

2
Marco Luly

Bien, OpenSSL devrait le faire facilement à partir d’un fichier # 12:

openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file
openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file

Peut-être plus de détails sur ce que l'erreur/échec est? 

1
Charlie Martin

La conversion d'un fichier de clés JKS en un seul fichier PEM peut facilement être effectuée à l'aide de la commande suivante: 

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Explication:

  1. keytool -list -rfc -keystore "myKeystore.jks" répertorie tous les éléments du KeyStore 'myKeyStore.jks' au format PEM. Cependant, il imprime également des informations supplémentaires.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" filtre tout ce dont nous n'avons pas besoin. Il ne nous reste que les PEM de tout dans le KeyStore.
  3. >> "myKeystore.pem" écrivez les fichiers PEM dans le fichier 'myKeyStore.pem'.
1
Mark Lagendijk

Au cas où OpenSL ne serait pas installé et que vous recherchiez une solution rapide, il existe un logiciel appelé portcle qui est très utile et de petite taille à télécharger.

L'inconvénient est qu'il n'y a pas de ligne de commande pour autant que je sache… .. Mais depuis l'interface graphique, il est assez simple d'exporter une clé privée PEM:

  1. Ouvrez votre magasin de clés JKS
  2. Faites un clic droit sur votre clé privée et sélectionnez Exporter.
  3. Sélectionnez clé privée et certificats et format PEM

     Export PEM private key from JKS with Portcle

1
Marcio Jasinski

Conversion d'un magasin de clés Java au format PEM

La réponse la plus précise doit être que cela n’est PAS possible. 

Un magasin de clés Java est simplement une installation de stockage pour les clés cryptographiques et certificats tandis que PEM est un format de fichier destiné uniquement aux certificats X.509.

0
whaefelinger

Commencez par vider le magasin de clés de JKS vers PKCS12

1. keytool -importkeystore -srckeystore ~ ​​/ .Android/debug.keystore -destkeystore intermediate.p12 -srcstoretype JKS -deststoretype PKCS12

Vider le nouveau fichier pkcs12 dans pem

  1. openssl pkcs12 -in intermediate.p12 -nodes -out intermediate.rsa.pem

Vous devriez avoir à la fois le cert et la clé privée au format pem. Divisez-les . Mettez la partie entre "BEGIN CERTIFICATE" et "END CERTIFICATE" dans cert.x509.pem Mettez la partie entre "BEGIN RSA PRIVATE KEY" et "END RSA PRIVATE KEY" dans private.rsa .pem Convertissez la clé privée au format pk8 comme prévu par signapk

3 . openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt

0
nkalra0123

d'abord créer le fichier de clés en tant que

C:\Program Files\Android\Android Studio\jre\bin>keytool -keystore androidkey.jks -genkeypair -alias androidkey 

Entrez le mot de passe du magasin de clés:
Ré-entrez le nouveau mot de passe:
Quels sont votre prénom et votre nom de famille? Inconnu: Prénom nom de famille
Quel est le nom de votre unité organisationnelle? Inconnu: Développement mobile
Quel est le nom de votre organisation? Inconnu: le nom de votre société
Quel est le nom de votre ville ou localité? Quel est le nom de votre état ou province?
Quel est le code de pays à deux lettres pour cette unité? Inconnu: IN // appuyez sur Entrée 

Maintenant, il vous sera demandé de confirmer

CN = Prénom Nom, OU = Développement mobile, O = nom de votre société, L = Nom de la ville, ST = Nom de l'État, C = IN correct? [non]: oui 

Entrez le mot de passe clé pour (RETURN si identique au mot de passe keystore): appuyez sur enter si vous voulez le même mot de passe

la clé a été générée, vous pouvez maintenant obtenir un fichier pem en utilisant la commande suivante

C:\Program Files\Android\Android Studio\jre\bin>keytool -export -rfc -alias androidkey -file Android_certificate.pem -keystore androidkey.jks
Entrez le mot de passe du magasin de clés:
Certificat stocké dans le fichier 

0
ankitdubey021

Essayez Keystore Explorer http://keystore-Explorer.org/

KeyStore Explorer est une interface graphique open source remplaçant les utilitaires de ligne de commande Java keytool et jarsigner. Il effectue également openssl/pkcs12.

0
Johnnyboy