Extraire le certificat et la clé privée d'un fichier PFX ou P12 avec OpenSSL
Un serveur web comme Nginx n'accepte pas directement un conteneur PFX/P12 : il faut en extraire séparément le certificat et la clé privée au format PEM. Les commandes OpenSSL pour le faire.
Le PFX (identique au P12, seule l’extension diffère selon l’écosystème d’origine) regroupe dans un seul fichier binaire protégé par mot de passe un certificat et sa clé privée. C’est le format attendu pour importer une identité complète dans Windows ou un navigateur, mais la plupart des serveurs web (Apache, Nginx) attendent au contraire deux fichiers PEM séparés (un pour le certificat, un pour la clé), ce qui impose une extraction avant de pouvoir les utiliser.
Extraire le certificat seul
openssl pkcs12 -in fichier.pfx -clcerts -nokeys -out certificat.crt
-clcerts sélectionne le certificat “client” (le certificat final, pas les autorités intermédiaires), -nokeys exclut la clé privée du résultat. OpenSSL demande le mot de passe du PFX avant de produire le certificat en PEM.
Extraire la clé privée seule
openssl pkcs12 -in fichier.pfx -nocerts -out cle-privee.pem
-nocerts exclut les certificats du résultat. Par défaut, la clé privée extraite reste elle-même chiffrée par un mot de passe (celui du PFX, ou un nouveau si demandé) ; ajouter -noenc produit une clé privée en clair, non chiffrée, pratique pour une configuration automatisée de serveur, mais à manipuler avec la même prudence qu’un secret en clair (les tutoriels plus anciens utilisent -nodes, un alias désormais déprécié mais toujours fonctionnel pour le même résultat) :
openssl pkcs12 -in fichier.pfx -nocerts -noenc -out cle-privee.pem
Extraire la chaîne de certification complète
Sans -clcerts, OpenSSL inclut aussi les certificats d’autorités intermédiaires présents dans le conteneur, utiles pour reconstituer la chaîne de confiance complète attendue par un serveur web :
openssl pkcs12 -in fichier.pfx -nokeys -out chaine-complete.pem
Erreur « unsupported » avec OpenSSL 3 sur un ancien PFX
Jusqu’à OpenSSL 1.1.1, openssl pkcs12 -export chiffrait par défaut la clé privée en 3DES et les certificats en RC2 40 bits (RC2-40-CBC). Depuis OpenSSL 3.0, RC2 ne fait plus partie du fournisseur d’algorithmes par défaut mais du fournisseur « legacy » : la lecture d’un tel PFX échoue avec une erreur digital envelope routines::unsupported qui mentionne RC2-40-CBC. Le 3DES, lui, reste dans le fournisseur par défaut et ne provoque pas cette erreur. L’option -legacy charge le fournisseur legacy et débloque la lecture :
openssl pkcs12 -legacy -in ancien.pfx -nocerts -noenc -out cle-privee.pem
Si OpenSSL n’est pas installé à l’échelle du système (cas fréquent sous Windows), il faut aussi indiquer où se trouvent les fournisseurs, avec -provider-path ou la variable d’environnement OPENSSL_MODULES. Réexporter ensuite le PFX sans -legacy produit un fichier chiffré en AES-256-CBC, lisible sans cette option.
Dans l’autre sens : reconstituer un PFX
À l’inverse, pour regrouper un certificat PEM et sa clé privée dans un PFX/P12 (par exemple pour l’importer dans Windows ou un navigateur) :
openssl pkcs12 -export -in certificat.pem -inkey cle-privee.pem -out fichier.pfx
Dans les deux sens, OpenSSL ne modifie aucune donnée cryptographique : seule la représentation (conteneur unique protégé par mot de passe contre fichiers PEM séparés) change.
Formats concernés
Catégories concernées
Questions fréquentes
Comment inspecter un PFX sans rien extraire ?
`openssl pkcs12 -in fichier.pfx -info -noout` vérifie le fichier avec son mot de passe et affiche sa structure, les algorithmes de chiffrement utilisés et le nombre d'itérations, sans écrire ni clé ni certificat.
Comment vérifier que la clé privée extraite correspond bien au certificat ?
Comparer les deux clés publiques : `openssl x509 -in certificat.crt -noout -pubkey` et `openssl pkey -in cle-privee.pem -pubout` doivent produire exactement le même bloc PEM. Cette méthode fonctionne quel que soit l'algorithme de la clé (RSA ou courbe elliptique).
Sources
- RFC 7292 : PKCS #12
- OpenSSL : pkcs12 command manual
- OpenSSL 1.1.1 : pkcs12 command manual (algorithmes de chiffrement par défaut)
- OpenSSL : OSSL_PROVIDER-legacy (algorithmes du fournisseur legacy)
- OpenSSL : pkey command manual
- OpenSSL : x509 command manual
Dernière mise à jour :