Certificats : formats, clés et OpenSSL

Chaîne de confiance, CA, CRL et AIA.

Comprendre les clés et certificats

Un certificat TLS/X.509 associe une identité (nom DNS, organisation, etc.) à une clé publique. Il est signé par une autorité de certification (CA). La clé privée correspondante reste secrète sur le serveur ou l'équipement.

ÉlémentÀ quoi il sertSecret ?
Clé privéeSert à prouver l'identité et à effectuer les opérations cryptographiques privées. Elle correspond à la clé publique du certificat.Oui — ne jamais la diffuser.
Clé publiquePeut être distribuée. Elle est incluse dans le certificat X.509.Non
CertificatContient notamment l'identité, la clé publique, la période de validité, l'émetteur et la signature de la CA.Non
ChaîneCertificats des CA intermédiaires permettant de remonter jusqu'à une racine de confiance.Non
CA racineAncre de confiance. Son certificat public peut être distribué ; sa clé privée doit être extrêmement protégée.Certificat : non / clé privée : oui

Formats et extensions

ExtensionType habituelContenuÀ retenir
.pemEncodage texte Base64 avec lignes -----BEGIN ...-----Certificat, clé privée, clé publique ou plusieurs certificatsPEM décrit surtout l'encodage, pas le rôle du fichier.
.crt / .cerCertificat X.509Certificat publicPeut être encodé en PEM ou en DER.
.keyConvention de nommageGénéralement une clé privéeL'extension ne garantit pas le format ; souvent PEM.
.derEncodage binaire ASN.1 DERSouvent certificat ou cléIllisible directement dans un éditeur texte.
.pfx / .p12PKCS#12, conteneur binaireCertificat + clé privée + éventuellement chaîne CASouvent protégé par mot de passe. Très pratique pour transporter/importer une identité complète.
fullchain.pemPEMCertificat serveur puis certificat(s) intermédiaire(s)Utilisé par de nombreux serveurs web et reverse proxies.
chain.pemPEMCA intermédiaire(s), parfois racine selon l'exportNe contient normalement pas la clé privée.
Réflexe : ne pas se fier uniquement à l'extension. Utiliser file et openssl pour identifier réellement le contenu.

Reconnaître le contenu d'un PEM

En-têteContenu
-----BEGIN CERTIFICATE-----Certificat X.509
-----BEGIN PRIVATE KEY-----Clé privée PKCS#8
-----BEGIN ENCRYPTED PRIVATE KEY-----Clé privée PKCS#8 chiffrée
-----BEGIN RSA PRIVATE KEY-----Ancienne représentation PKCS#1 d'une clé privée RSA
-----BEGIN PUBLIC KEY-----Clé publique seule

Inspecter avant d'extraire

file serveur.pfxIdentifier grossièrement le type de fichier
openssl pkcs12 -info -in serveur.pfx -nooutAfficher les informations d'un PKCS#12/PFX
openssl x509 -in serveur.crt -text -nooutLire un certificat PEM
openssl x509 -inform DER -in serveur.cer -text -nooutLire un certificat DER
openssl pkey -in serveur.key -check -nooutContrôler une clé privée avec l'interface générique OpenSSL

Extraire un PFX / PKCS#12

Exemple avec serveur.pfx. OpenSSL demande le mot de passe du PFX.

openssl pkcs12 -in serveur.pfx -nocerts -nodes -out serveur.keyExtraire la clé privée non chiffrée
Attention : -nodes laisse la clé privée non chiffrée sur disque. Protéger le fichier avec des permissions strictes.
chmod 600 serveur.keyLimiter la lecture/écriture au propriétaire
openssl pkcs12 -in serveur.pfx -clcerts -nokeys -out serveur-cert-temp.pemExtraire le certificat utilisateur/serveur
openssl x509 -in serveur-cert-temp.pem -out serveur.crtRéécrire un certificat PEM propre sans Bag Attributes
openssl pkcs12 -in serveur.pfx -cacerts -nokeys -out serveur-chain.pemExtraire les certificats CA présents dans le PFX
cat serveur.crt serveur-chain.pem > serveur-fullchain.pemConstruire un fullchain si l'application le demande

Extraire plusieurs PFX avec un seul mot de passe

Si tous les fichiers .pfx du dossier utilisent le même mot de passe, le script suivant le demande une seule fois, sans l'afficher.

cd ~/partage read -s -p "Mot de passe des PFX : " PFXPASS echo for f in *.pfx; do name="${f%.pfx}" echo "Extraction de $f..." openssl pkcs12 -in "$f" -nocerts -nodes \ -passin pass:"$PFXPASS" \ -out "${name}.key" openssl pkcs12 -in "$f" -clcerts -nokeys \ -passin pass:"$PFXPASS" \ -out "${name}-cert-temp.pem" openssl x509 -in "${name}-cert-temp.pem" \ -out "${name}.crt" openssl pkcs12 -in "$f" -cacerts -nokeys \ -passin pass:"$PFXPASS" \ -out "${name}-chain.pem" rm -f "${name}-cert-temp.pem" done unset PFXPASS chmod 600 *.keyTraiter automatiquement tous les .pfx du dossier
Le mot de passe n'est pas écrit en clair dans le script. Il existe temporairement dans la variable shell PFXPASS, puis unset la supprime de l'environnement du shell.

Vérifier que le certificat correspond à la clé privée

Méthode générique utilisable avec RSA ou EC : comparer l'empreinte SHA-256 de la clé publique extraite du certificat avec celle dérivée de la clé privée.

openssl x509 -in serveur.crt -pubkey -noout | openssl pkey -pubin -outform DER | sha256sumEmpreinte de la clé publique contenue dans le certificat
openssl pkey -in serveur.key -pubout -outform DER | sha256sumEmpreinte de la clé publique dérivée de la clé privée
Les deux SHA-256 doivent être identiques. Sinon le certificat et la clé privée ne forment pas une paire.

Vérifier certificat, chaîne et service TLS

openssl x509 -in serveur.crt -noout -subject -issuer -dates -serial -fingerprint -sha256Afficher identité, émetteur, validité, numéro de série et empreinte
openssl verify -CAfile RootCA.pem -untrusted IntermediateCA.pem serveur.crtVérifier une chaîne avec une racine et une CA intermédiaire
openssl s_client -connect serveur.warx.home:443 -servername serveur.warx.home -showcertsVoir les certificats réellement présentés par un service TLS

Conversions utiles

openssl x509 -in certificat.pem -outform DER -out certificat.derPEM → DER
openssl x509 -inform DER -in certificat.der -out certificat.pemDER → PEM
openssl pkcs12 -export -out serveur.pfx -inkey serveur.key -in serveur.crt -certfile chain.pemCréer un PFX à partir de la clé, du certificat et de la chaîne
openssl pkey -in serveur.key -pubout -out serveur-public.pemExtraire la clé publique depuis la clé privée

🚨 Réflexe TSSR

  • Identifier le format réel avant conversion.
  • Ne jamais envoyer ou publier une clé privée.
  • Protéger les .key avec des permissions strictes.
  • Vérifier que certificat et clé privée correspondent.
  • Contrôler le CN/SAN, la période de validité, l'émetteur et la chaîne.
  • Présenter les intermédiaires nécessaires au serveur TLS.

💡 À retenir

Certificat = identité + clé publique + signature de CA. La clé privée correspondante reste secrète. Un PFX peut contenir les deux, tandis qu'un PEM est avant tout un encodage texte pouvant contenir plusieurs types d'objets cryptographiques.

⚠ Pièges fréquents

  • Confondre .pem avec « certificat ».
  • Croire qu'un .crt est forcément du PEM.
  • Copier une clé privée avec des permissions trop larges.
  • Installer seulement le certificat serveur sans CA intermédiaire.
  • Comparer les modulus pour un certificat EC : cette ancienne méthode vise RSA ; préférer la comparaison des clés publiques avec openssl pkey.
  • Mettre le mot de passe du PFX en clair dans l'historique shell.

🎯 Ce que le jury attend

  • Différencier clé privée, clé publique et certificat.
  • Expliquer le rôle de la chaîne de certification.
  • Reconnaître PEM, DER et PKCS#12/PFX.
  • Savoir extraire et convertir avec OpenSSL.
  • Savoir prouver qu'un certificat correspond à sa clé privée.