web-dev-qa-db-fra.com

Comment exporter une chaîne de certificats CA à partir de PFX au format PEM sans attributs de sac

J'ai un fichier PKCS12 contenant la chaîne de certificats complète et la clé privée. Je dois le diviser en 3 fichiers pour une application. Les 3 fichiers dont j'ai besoin sont les suivants (au format PEM):

  • un fichier de clé non crypté
  • un fichier de certificat client
  • un fichier de certificat CA (racine et tous intermédiaires)

C'est une tâche courante que je dois effectuer, donc je cherche un moyen de le faire sans aucune modification manuelle de la sortie.

J'ai essayé ce qui suit:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>

Cela fonctionne bien, cependant, la sortie contient des attributs de sac, que l'application ne sait pas gérer.

Après quelques recherches, j'ai trouvé une solution suggérée de passer les résultats par x509 pour supprimer les attributs du sac.

openssl x509 -in <clientcert.cer> -out <clientcert.cer>

Cela fonctionne, mais je rencontre un problème sur le fichier cacert. Le fichier de sortie contient uniquement l'un des 3 certificats de la chaîne.

Existe-t-il un moyen d'éviter d'inclure les attributs bag dans la sortie de la commande pkcs12, ou un moyen de faire en sorte que la sortie de la commande x509 inclue tous les certificats? De plus, si l'exécuter via x509 est la solution la plus simple, existe-t-il un moyen de diriger la sortie de pkcs12 vers x509 au lieu d'écrire deux fois le fichier?

35
BryKKan

La solution que j'ai finalement trouvée a été de la faire passer à travers sed.

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
40
BryKKan