Conversion d'un magasin de clés Java au format PEM
-
19-08-2019 - |
Question
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 fichier de clés directement en PEM, j’ai essayé de créer un fichier PKCS12, puis de le convertir en fichier PEM et en fichier 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 à pem est préférable.
La solution
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' Enter keystore password: Re-enter new password: Enter key password for (RETURN if same as keystore password): bash$ keytool -keystore foo.jks -exportcert -alias foo | \ openssl x509 -inform der -text Enter keystore password: asdasd Certificate: Data: Version: 3 (0x2) Serial Number: 1237334757 (0x49c03ae5) Signature Algorithm: dsaWithSHA1 Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Validity Not Before: Mar 18 00:05:57 2009 GMT Not After : Jun 16 00:05:57 2009 GMT Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Subject Public Key Info: Public Key Algorithm: dsaEncryption DSA Public Key: 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 Enter destination keystore password: Re-enter new password: Enter source keystore password: Entry for alias foo successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled bash$ openssl pkcs12 -in foo.p12 -out foo.pem Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: bash$ openssl x509 -text -in foo.pem Certificate: Data: Version: 3 (0x2) Serial Number: 1237334757 (0x49c03ae5) Signature Algorithm: dsaWithSHA1 Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Validity Not Before: Mar 18 00:05:57 2009 GMT Not After : Jun 16 00:05:57 2009 GMT Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Subject Public Key Info: Public Key Algorithm: dsaEncryption DSA Public Key: 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 Enter PEM pass phrase: 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 - le 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 en 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 fichier de clés JKS en fichier 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 exporter uniquement 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
Autres conseils
J'ai continué à avoir des erreurs de openssl
en utilisant 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 fonctionne pour mon fichier JKS
keytool -importkeystore -srckeystore foo.jks \
-destkeystore foo.p12 \
-srcstoretype jks \
-srcalias mykey \
-deststoretype pkcs12 \
-destkeypass DUMMY123
La clé configurait 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!
Eh bien, OpenSSL devrait le faire facilement à partir d'un fichier n ° 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 l’erreur / échec?
Vous pouvez facilement convertir un fichier JKS KeyStore en un fichier PEM à 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] * - * /, / - * FIN [A-Z] - * /! d"
filtre tout ce dont nous n'avons pas besoin. Il ne nous reste que les PEM de tout ce qui se trouve dans le KeyStore. -
> > "myKeystore.pem"
écrit les fichiers PEM dans le fichier "myKeyStore.pem".
Si vous n'avez pas installé openssl et recherchez une solution rapide, un logiciel appelé portcle qui est très utile et de petite taille à télécharger.
L’inconvénient est qu’il n’ya pas de ligne de commande à ma connaissance. Mais à partir de l'interface graphique, il est assez simple d'exporter une clé privée PEM:
Essayez Keystore Explorer http://keystore-explorer.org/
KeyStore Explorer est une interface graphique à source ouverte remplaçant les utilitaires de ligne de commande Java keytool et jarsigner. Il fait également openssl / pkcs12.
commencez par créer le fichier de clés sous la forme
C: \ Programmes \ Android \ Android Studio \ jre \ bin > keytool -keystore androidkey.jks -genkeypair -alias androidkey
Entrez le mot de passe du magasin de clés:
Ressaisissez votre nouveau mot de passe:
Quel est votre prénom et votre nom?
Inconnu: Prénom Nom
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
Est-ce que 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? [no]: oui
Entrez le mot de passe clé pour (RETURN si identique au mot de passe du 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: \ Programmes \ 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
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
Importez le nouveau fichier pkcs12 dans pem
- openssl pkcs12 -in intermediate.p12 -nodes -out intermediate.rsa.pem
Vous devriez avoir à la fois la clé cert et la clé privée au format pem. Divisez-les. Placez la partie entre & # 8220; BEGIN CERTIFICATE & # 8221; et & # 8220; END CERTIFICATE & # 8221; dans cert.x509.pem Placez la partie entre & # 8220; BEGIN RSA PRIVATE KEY & # 8221; et & # 8220; END RSA PRIVATE KEY & # 8221; 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
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 certificats de clés cryptographiques et , tandis que PEM est un format de fichier réservé aux certificats X.509.