Comment convertir un fichier .pfx en keystore avec une clé privée?

107

J'ai besoin de signer l'application Android ( .apk).
J'ai un .pfxfichier. Je l'ai converti en .cerfichier via Internet Explorer, puis converti .cerà l' .keystoreaide de keytool. Ensuite, j'ai essayé de signer .apkavec jarsigner mais il dit que .keystore ne contient pas de clé privée.

Qu'est-ce que je fais mal?

Ola
la source
Cela peut être utile: comment puis-je trouver et exécuter l'outil keytool pour Windows stackoverflow.com/questions/5488339/...
Peter Barbanyaga

Réponses:

259

Utilisation de JDK 1.6 ou version ultérieure

Il a été souligné par Justin dans les commentaires ci-dessous que keytool seul est capable de le faire en utilisant la commande suivante (bien que seulement dans JDK 1.6 et versions ultérieures):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

Utilisation de JDK 1.5 ou inférieur

OpenSSL peut tout faire. Cette réponse sur JGuru est la meilleure méthode que j'ai trouvée jusqu'à présent.

Assurez-vous tout d'abord que OpenSSL est installé. De nombreux systèmes d'exploitation l'ont déjà installé comme je l'ai trouvé avec Mac OS X.

Les deux commandes suivantes convertissent le fichier pfx dans un format qui peut être ouvert en tant que magasin de clés Java PKCS12:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

Notez que le nom fourni dans la deuxième commande est l'alias de votre clé dans le nouveau magasin de clés.

Vous pouvez vérifier le contenu du magasin de clés à l'aide de l'utilitaire Java keytool avec la commande suivante:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

Enfin, si vous en avez besoin, vous pouvez le convertir en un magasin de clés JKS en important le magasin de clés créé ci-dessus dans un nouveau magasin de clés:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
MikeD
la source
28
les trois étapes ne sont pas nécessaires, exécutez simplement: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris
Je pense que les anciennes versions de keytool ne vous permettraient pas de le faire. Je me souviens qu'il y a 8 ans, je devais exécuter openssl mais maintenant avec keytool dans Oracle JDK 6 et 7, cela fonctionne comme un charme, tout comme Justin l'a dit.
David Brossard
2
Veuillez noter que j'ai donné cette réponse sous une forme plus simple avec plus de détails un an avant Justin.
gjpc
@gjpc noté. Votre réponse est très complète et mérite beaucoup de votes
positifs
C'est vraiment une excellente réponse et cela m'a sauvé après des jours de recherche. Cette réponse mérite vraiment beaucoup plus de votes positifs. Merci Monsieur.
Mythul
22

jarsigner peut utiliser votre fichier pfx comme magasin de clés pour signer votre fichier jar. Assurez-vous que votre fichier pfx possède la clé privée et la chaîne de certificats lorsque vous l'exportez. Il n'est pas nécessaire de convertir vers d'autres formats. L'astuce consiste à obtenir l' alias de votre fichier pfx:

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

Une fois que vous avez votre alias, la signature est facile

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

Les deux commandes ci-dessus vous demanderont le mot de passe que vous avez spécifié lors de l'exportation pfx. Si vous souhaitez que votre mot de passe soit suspendu en texte clair, utilisez le commutateur -storepass avant le commutateur -keystore

Une fois signé, admirez votre travail:

jarsigner.exe -verify -verbose -certs  yourjarfile
gjpc
la source
1
+1 pour ne pas avoir à convertir le fichier keystore (je l'ai déjà dans suffisamment de formats!)
Trejkaz
22

J'ai trouvé cette page qui vous explique comment importer un PFX vers JKS (Java Key Store):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME
kaptan
la source
3
Cela devrait être la réponse complète!
JustAGuy
Je cherchais une réponse comme celle-ci - avec un pseudonyme
user3437460
J'ai un problème, le pfx n'a pas de mot de passe, -srcstorepassmon problème aussi. Ce PFX est créé par un client LetsEncrypt pour Windows
FiruzzZ
2

Votre fichier PFX doit contenir la clé privée. Exportez la clé privée et le certificat directement à partir de votre fichier PFX (par exemple en utilisant OpenSSL) et importez-les dans votre keystore Java.

Éditer

Informations complémentaires:

  • Téléchargez OpenSSL pour Windows ici .
  • Exporter la clé privée: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Certificat d'exportation: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Importez la clé privée et le certificat dans le keystore Java à l'aide de keytool.
Bernard
la source
pourriez-vous s'il vous plaît me dire comment puis-je importer key.pem et cert.pem à l'aide de keytool?
Sad Al Abdullah
1
Petit plus: il faut ajouter -nodes à la fin lors de l'export de private ky
morgan_il
2

Justin (ci-dessus) est exact. Cependant, gardez à l'esprit que selon la personne auprès de laquelle vous obtenez le certificat (autorité de certification intermédiaire, autorité de certification racine impliquée ou non) ou la manière dont le pfx est créé / exporté, la chaîne de certificats peut parfois manquer. Après l'importation, vous auriez un certificat de type PrivateKeyEntry, mais avec une chaîne de longueur de 1.

Pour résoudre ce problème, il existe plusieurs options. L'option la plus simple dans mon esprit est d'importer et d'exporter le fichier pfx dans IE (en choisissant l'option d'inclure tous les certificats dans la chaîne). Le processus d'importation et d'exportation des certificats dans IE devrait être très facile et bien documenté ailleurs.

Une fois exporté, importez le keystore comme Justin l'a indiqué ci-dessus. Maintenant, vous auriez un keystore avec un certificat de type PrivateKeyEntry et avec une longueur de chaîne de certificats supérieure à 1.

Certains clients de services Web basés sur .Net ont une erreur (impossible d'établir une relation d'approbation), si vous ne faites pas ce qui précède.

TechIsFun
la source
Cela ne semble pas fonctionner sur IE11. Il ne parvient pas à inclure la chaîne de certificats même si je le lui dis. Je sais que cela a fonctionné dans le passé.
Brian Knoblauch
0

Si vous travaillez avec JDK 1.5 ou inférieur, l'utilitaire keytool n'aura pas l' -importkeystoreoption (voir la documentation keytool JDK 1.5 ) et la solution de MikeD ne sera disponible qu'en transférant le .pfxsur une machine avec un JDK plus récent (1.6 ou supérieur).

Une autre option dans JDK 1.5 ou version antérieure (si vous avez un produit Oracle WebLogic) consiste à suivre les instructions de ce document Oracle: Utilisation des formats de certificat PFX et PEM avec les fichiers de clés . Il décrit la conversion au .pemformat, comment extraire les informations de certificats de ce format textuel et les importer au .jksformat avec l' java utils.ImportPrivateKeyutilitaire (il s'agit d'un utilitaire inclus avec le produit WebLogic).

Mariano Paniga
la source