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

Je dois signer une application Android ( .apk ).
J’ai un fichier .pfx . Je l’ai converti en fichier .cer via Internet Explorer, puis converti .cer en .keystore utilisant keytool. Ensuite, j’ai essayé de signer .apk avec jarsigner mais il est dit que .keystore ne contient pas de clé privée.

Qu’est-ce que je fais mal?

Utiliser JDK 1.6 ou version ultérieure

Justin a fait remarquer dans les commentaires ci-dessous que keytool seul est capable de faire cela en utilisant la commande suivante (mais 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.

Tout d’abord, assurez-vous 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 pouvant être ouvert en tant que fichier 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 fichier de clés.

Vous pouvez vérifier le contenu de la clé de stockage à l’aide de l’utilitaire keytool Java à l’aide de la commande suivante:

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

Enfin, si vous en avez besoin, vous pouvez convertir cela en 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 

jarsigner peut utiliser votre fichier pfx comme fichier 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 certificateion lorsque vous l’exportez. Il n’y a pas besoin 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 affiché en clair, utilisez le commutateur -storepass avant le commutateur -keystore

Une fois signé, admirez votre travail:

 jarsigner.exe -verify -verbose -certs yourjarfile 

J’ai trouvé cette page qui vous indique comment importer un fichier 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 

Votre fichier PFX doit contenir la clé privée qu’il contient. Exportez la clé privée et le certificate directement depuis votre fichier PFX (par exemple, en utilisant OpenSSL) et importez-les dans votre fichier de clés Java.

modifier

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
  • Importer une clé privée et un certificate dans le keystore Java à l’aide de keytool .

Justin (ci-dessus) est exact. Cependant, gardez à l’esprit que selon qui vous obtenez le certificate (autorité de certificateion intermédiaire, autorité de certificateion racine impliquée ou non) ou la manière dont le fichier pfx est créé / exporté, il peut parfois manquer la chaîne de certificates. Après l’importation, vous auriez un certificate de type PrivateKeyEntry, mais avec une chaîne de longueur égale à 1.

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

Une fois exporté, importez le fichier de clés comme Justin l’a indiqué ci-dessus. Désormais, vous disposeriez d’un fichier de clés avec un certificate de type PrivateKeyEntry et d’une longueur de chaîne de certificate supérieure à 1.

Certains clients de services Web basés sur .Net génèrent des erreurs (impossibilité d’établir une relation de confiance) si vous ne faites pas ce qui précède.

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

Une autre option dans JDK 1.5 ou ci-dessous (si vous possédez un produit Oracle WebLogic) consiste à suivre les instructions de ce document Oracle: Utilisation des formats de certificates PFX et PEM avec des magasins de clés . Il décrit la conversion au format .pem , comment extraire les informations des certificates de ce format textuel et les importer au format .jks avec l’utilitaire java utils.ImportPrivateKey (cet utilitaire est inclus avec le produit WebLogic).