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 sert | Secret ? |
|---|---|---|
Clé privée | Sert à prouver l'identité et à effectuer les opérations cryptographiques privées. Elle correspond à la clé publique du certificat. | Oui — ne jamais la diffuser. |
Clé publique | Peut être distribuée. Elle est incluse dans le certificat X.509. | Non |
Certificat | Contient notamment l'identité, la clé publique, la période de validité, l'émetteur et la signature de la CA. | Non |
Chaîne | Certificats des CA intermédiaires permettant de remonter jusqu'à une racine de confiance. | Non |
CA racine | Ancre 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
| Extension | Type habituel | Contenu | À retenir |
|---|---|---|---|
.pem | Encodage texte Base64 avec lignes -----BEGIN ...----- | Certificat, clé privée, clé publique ou plusieurs certificats | PEM décrit surtout l'encodage, pas le rôle du fichier. |
.crt / .cer | Certificat X.509 | Certificat public | Peut être encodé en PEM ou en DER. |
.key | Convention de nommage | Généralement une clé privée | L'extension ne garantit pas le format ; souvent PEM. |
.der | Encodage binaire ASN.1 DER | Souvent certificat ou clé | Illisible directement dans un éditeur texte. |
.pfx / .p12 | PKCS#12, conteneur binaire | Certificat + clé privée + éventuellement chaîne CA | Souvent protégé par mot de passe. Très pratique pour transporter/importer une identité complète. |
fullchain.pem | PEM | Certificat serveur puis certificat(s) intermédiaire(s) | Utilisé par de nombreux serveurs web et reverse proxies. |
chain.pem | PEM | CA intermédiaire(s), parfois racine selon l'export | Ne 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ête | Contenu |
|---|---|
-----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 fichieropenssl pkcs12 -info -in serveur.pfx -nooutAfficher les informations d'un PKCS#12/PFXopenssl x509 -in serveur.crt -text -nooutLire un certificat PEMopenssl x509 -inform DER -in serveur.cer -text -nooutLire un certificat DERopenssl pkey -in serveur.key -check -nooutContrôler une clé privée avec l'interface générique OpenSSLExtraire 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éeAttention :
-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étaireopenssl pkcs12 -in serveur.pfx -clcerts -nokeys -out serveur-cert-temp.pemExtraire le certificat utilisateur/serveuropenssl x509 -in serveur-cert-temp.pem -out serveur.crtRéécrire un certificat PEM propre sans Bag Attributesopenssl pkcs12 -in serveur.pfx -cacerts -nokeys -out serveur-chain.pemExtraire les certificats CA présents dans le PFXcat serveur.crt serveur-chain.pem > serveur-fullchain.pemConstruire un fullchain si l'application le demandeExtraire 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 dossierLe 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 certificatopenssl pkey -in serveur.key -pubout -outform DER | sha256sumEmpreinte de la clé publique dérivée de la clé privéeLes 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 empreinteopenssl verify -CAfile RootCA.pem -untrusted IntermediateCA.pem serveur.crtVérifier une chaîne avec une racine et une CA intermédiaireopenssl s_client -connect serveur.warx.home:443 -servername serveur.warx.home -showcertsVoir les certificats réellement présentés par un service TLSConversions utiles
openssl x509 -in certificat.pem -outform DER -out certificat.derPEM → DERopenssl x509 -inform DER -in certificat.der -out certificat.pemDER → PEMopenssl 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îneopenssl 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
.keyavec 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
.pemavec « certificat ». - Croire qu'un
.crtest 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.