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.
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:
(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
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.
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
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
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>
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!
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?
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:
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.| 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.>> "myKeystore.pem"
écrivez les fichiers PEM dans le fichier 'myKeyStore.pem'.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:
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.
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
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
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
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.