Récupérer et lire le contenu d’un certificat x.509 (TLS) via la commande OpenSSL
Sommaire
I. Présentation
Dans cet article, nous allons apprendre à récupérer et lire le contenu d’un certificat x.509 en utilisant la commande "openssl".
Les certificats x.509 sont très importants pour sécuriser les communications entre clients et serveurs sur Internet. Nous ferons d'abord un bref rappel de ce qu'est un certificat x.509, puis nous détaillerons les méthodes pour obtenir ces certificats via un navigateur ou directement avec "openssl", et enfin, nous verrons comment extraire les informations contenues dans un certificat.
II. Rappel sur le certificat x.509
Vous avez sûrement entendu parler des protocoles cryptographiques TLS (Transport Layer Security) et SSL (Secure Socket Layer) qui permettent de chiffrer les communications entre un client et un serveur pour assurer leur confidentialité. Ces protocoles fonctionnent grâce au système de clés privées et publiques. Lorsqu’un client souhaite communiquer avec un serveur, il doit au préalable récupérer certaines informations auprès de celui-ci pour établir cette communication sécurisée.
Ces informations sont "packagées" dans un fichier : c’est le certificat. Le format x.509 est l'un des standards qui permettent de structurer et construire les certificats par clé publique, et c’est globalement le format le plus utilisé.
TLS et SSL utilisent des certificats x.509 pour établir des connexions sécurisées. Le certificat contient la clé publique du serveur, qui peut être utilisée par les clients pour chiffrer des données envoyées au serveur.
Un certificat x.509 va donc contenir tout un tas d’informations sur le serveur et son certificat, comme le nom de l’autorité de certification ayant signé le certificat, la date de validité et d’expiration du certificat, le nom de domaine pour lequel il est validé, les algorithmes de signature utilisés, etc. Parce qu'il respecte un format standard, toutes les informations nécessaires au client pourront être retrouvées facilement par ce dernier.
III. Récupérer le certificat SSL d’un service web
Nous allons à présent voir comment récupérer le certificat d'un serveur à partir d'un navigateur, vous verrez que vous aviez cette information sous le nez depuis longtemps, il suffit simplement d'y accéder.
Je vous montre ici la procédure depuis un navigateur Firefox, mais elle est globalement la même pour tous les navigateurs. Rendez-vous donc sur votre site favori en HTTPS et repérez la fameuse icône du cadenas à gauche de l'URL, cliquez dessus, puis sur "Connection secure/Connexion sécurisée" :
Vous êtes ici informé que le site web sur lequel vous naviguez dispose bien d'un certificat SSL et s'il est considéré comme valide. Accédez ensuite à la section "More Information / Plus d'informations" :
Vous arriverez dans l'onglet "Security/Sécurité" de la page web que vous consultez et aurez accès au bouton "View Certificate/Afficher le certificat", qui ouvrira une page web contenant les informations du certificat, ce qui vous donnera la possibilité de le télécharger ("PEM (cert)"). Vous pouvez aussi simplement consulter les informations du certificat à partir de cette page, sans le télécharger.
Et voilà, vous vous retrouverez avec un fichier au format ".pem" ("www-it-connect-fr.pem" dans mon cas) dans votre dossier téléchargement.
.pem ? Pourquoi pas .x509 si c'est le format utilisé ?
Lorsque vous téléchargez un certificat serveur depuis un navigateur, le fichier obtenu est souvent au format .PEM plutôt que simplement .X509 en raison de la manière dont les informations sont encodées et encapsulées.
- PEM (Privacy Enhanced Mail) est un format de fichier qui utilise l'encodage Base64 pour représenter des données binaires dans un format de texte ASCII. Ce format est couramment utilisé pour les certificats X.509 afin de faciliter leur transfert et leur stockage en tant que fichiers texte.
- X.509 est une norme pour les certificats numériques, mais elle ne spécifie pas un format de fichier unique. Un certificat X.509 peut être encapsulé dans différents formats de fichier, tels que DER (binaire) ou PEM (texte ASCII).
Ainsi, un fichier .PEM contient un certificat X.509 encodé en Base64 et encapsulé entre des en-têtes et des pieds de page, comme "-----BEGIN CERTIFICATE-----
" et "-----END CERTIFICATE-----
". Cela permet une manipulation plus facile des certificats, notamment lors de leur transfert par e-mail ou leur stockage dans des fichiers texte.
PEM et DER sont donc deux formats de fichiers pouvant stocker la même chose (un certificat X.509), mais dans un encodage différent.
B. Avec la commande openssl
La procédure "manuelle" que nous venons de voir fonctionne très bien, mais peut être automatisée facilement à l'aide de la commande "openssl" sous Linux. Cela peut notamment être pratique pour une analyse automatisée des données contenues dans un certificat. À tout hasard : vérification fréquente de l'expiration des certificats de vos applications web. Voici comment récupérer facilement le certificat d’un serveur distant dans un fichier .PEM :
# Télécharger le certificat d’un service web au format PEM
openssl s_client -connect <Nom de domaine>:443 -showcerts </dev/null | openssl x509 -outform pem > <nom de fichier>.pem
# Exemple
$ openssl s_client -connect www.it-connect.fr:443 -showcerts </dev/null | openssl x509 -outform pem > www.it-connect.pem
Warning: Reading certificate from stdin since no -in or -new option is given
Connecting to 104.21.22.214
depth=2 C=US, O=Google Trust Services LLC, CN=GTS Root R4
verify return:1
depth=1 C=US, O=Google Trust Services, CN=WE1
verify return:1
depth=0 CN=www.it-connect.fr
verify return:1
DONE
Nous utilisons ici deux commandes "openssl". La première permet de télécharger le certificat du service web souhaité ("-connect" et "-showcert"), le résultat de cette commande étant envoyé à la seconde via un pipe "|". Cette seconde commande stocke les données reçues au format PEM ("-outform pem") dans le fichier indiqué.
Une fois encore, on se retrouve avec un fichier au format .pem sur notre système. C'est sur ce fichier que nous allons travailler pour récupérer différentes informations concernant le certificat.
IV. Lire les données d’un certificat x.509 avec openssl
A. Affiche tout le contenu d’un fichier PEM
Commençons par afficher la totalité des informations contenues dans notre certificat PEM, nous verrons ensuite comment faire le tri et afficher des informations spécifiques. Il faut ici spécifier à la commande "openssl" le fichier à traiter (option "-in") ainsi que l'option "-text" :
# Afficher les informations d'un certificat X.509 au format PEM
openssl x509 -in <Nom de fichier>.pem -noout -text
# Exemple
openssl x509 -in www.it-connect.pem -noout -text
Voici un exemple de ce que vous obtiendrez dans votre terminal lors de l'exécution de cette commande :
Vous aurez ici toutes les informations contenues dans le certificat de façon structurée et ordonnée.
B. Extraire des informations spécifiques d’un certificat
Nous allons à présent voir comment extraire des informations précises d'un certificat en utilisant différentes options de la commande "openssl".
- Extraire le subject
Au sein d'un certificat SSL, le "subject" est une entité désignée par le certificat. Il contient les informations d'identité du propriétaire du certificat, telles que le nom de domaine (Common Name - CN), le nom de l'organisation, l'unité organisationnelle, la ville, l'état ou la province et le pays.
# Extraire le subject d'un certificat
opensslx509 -in <nom du fichier>.pem -noout -subject
# Exemple
$ openssl x509 -in www.it-connect.pem -noout -subject
subject=CN=www.it-connect.fr
Nous obtenons en réponse au minimum le CN, qui est le nom de domaine pour lequel le certificat est valide. Il faut savoir qu'un certificat peut être émis pour un nom de domaine précis ou pour tous les sous-domaines d'un domaine spécifié. Dans ce cas, le "subject" récupéré contiendra un astérisque (appelé wildcard, "*").
Une extension de la norme X.509 permet également de spécifier des valeurs additionnelles dans l'attribut "subjectAltName". Il est donc également important de récupérer le contenu de cet attribut, ce qui est possible via l'option "-ext subjectAltName" :
# Extraire le contenu de l’attribut subjectAltName d’un certificat x.509
openssl x509 -in cyber.gouv.fr.pem -noout -ext subjectAltName
# Exemple
$ openssl x509 -in cyber.gouv.fr.pem -noout -subject
subject=C=FR, L=CLICHY, O=ECRITEL, CN=cyber.gouv.fr, serialNumber=S284060474
$ openssl x509 -in cyber.gouv.fr.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:www.cyber.gouv.fr, DNS:cyber.gouv.fr
Nous voyons ici que le certificat x.509 est valide pour "cyber.gouv.fr", mais aussi pour "www.cyber.gouv.fr".
- Extraire l'issuer
Au sein d'un certificat SSL, l'issuer désigne l'entité qui a émis et signé le certificat. Nous pouvons récupérer uniquement l’issuer d’un certificat avec l’option “-issuer” :
# Extraire l'issuer d'un certificat
openssl x509 -in <nom du fichier>.pem -noout -issuer
# Exemple
$ openssl x509 -in www.it-connect.pem -noout -issuer
issuer=C=US, O=Google Trust Services, CN=WE1
Nous obtenons en réponse les informations de l'autorité de certification ayant émis le certificat.
- Extraire la date de début et d’expiration
Les dates de début et d'expiration indiquent la période de validité du certificat. Elles spécifient quand le certificat commence à être valide et quand il expire. Ces informations peuvent être récupérées à l’aide de l’option "-dates" :
# Extraire les dates de début et d'expiration d'un certificat
openssl x509 -in <nom du fichier>.pem -noout -dates
# Exemple
$ openssl x509 -in www.it-connect.pem -noout -dates
notBefore=Jun 23 15:24:21 2024 GMT
notAfter=Sep 21 15:24:20 2024 GMT
Nous obtenons en réponse les dates de début ("notBefore") et d'expiration ("notAfter") de la validité du certificat. Il existe une autre option intéressante qui permet de savoir si un certificat expire dans plus ou moins X secondes. Si l’on spécifie la valeur (en seconde) "7776000" à l’option "-ckeckend", nous pouvons savoir s’il sera expiré dans 3 mois, ce qui est le cas dans mon exemple :
# Savoir si un certificat sera expiré d’ici 3 mois
openssl x509 -in <nom du fichier>.pem -noout -checkend 7776000
# Exemple
$ openssl x509 -in www.it-connect.pem -noout -checkend 7776000
Certificate will expire
C. openssl : quelques astuces pour aller plus loin
Nous avons vu les principales options pour traiter un certificat x.509 via OpenSSL, mais il en existe bien d'autres. Voici une liste complète des options disponibles :
- -modulus : Affiche le modulus du certificat.
- -serial : Affiche le numéro de série du certificat.
- -subject : Affiche le sujet du certificat.
- -issuer : Affiche l'émetteur du certificat.
- -dates : Affiche les dates de début et d'expiration du certificat.
- -purpose : Affiche les usages du certificat.
- -fingerprint : Affiche l'empreinte digitale du certificat.
- -email : Affiche les adresses email dans le certificat.
- -hash : Affiche le hachage du sujet du certificat.
- -checkend
<seconds>
: Vérifie si le certificat expirera dans un certain nombre de secondes. - -ocspid : Affiche l'ID de l'OCSP du certificat.
Dernière astuce, nous pouvons utiliser la commande "openssl" directement en spécifiant un nom de domaine et sans passer par l’utilisation d’un fichier en local, voici un exemple :
# Vérifier l’expiration d’un certificat x.509 en requêtant directement l’application web
$ openssl s_client -connect www.it-connect.fr:443 2>/dev/null </dev/null | openssl x509 -checkend 7776000
Warning: Reading certificate from stdin since no -in or -new option is given
Certificate will not expire
Ainsi, si l’on dispose d’un fichier contenant un domaine par ligne, on peut très rapidement déterminer si l’un d’entre eux expire dans moins de 3 moins. Cela à l’aide d’une boucle "For" (apprenez à utiliser les boucles For en Bash avec notre tutoriel) :
$ for domaine in $(cat /tmp/cibles.txt); do
echo -e "[+] $domaine :"
cible="$domaine:443"; openssl s_client -connect $cible 2>/dev/null </dev/null | openssl x509 -noout -checkend 7776000 2>/dev/null
done
[+] www.it-connect.fr :
Certificate will expire
[+] cyber.gouv.fr :
Certificate will expire
[+] www.cisa.gov :
Certificate will not expire
Toutes les autres options vues dans ce tutoriel sont utilisables de cette façon.
V. Conclusion
Nous avons vu dans cet article comment récupérer un certificat x.509 au format PEM à l'aide de notre navigateur ou de la commande "openssl". Maîtriser la commande OpenSSL pour gérer les certificats x.509 lorsque l'on est administrateur système, développeur ou que l'on travaille dans la cybersécurité est très utile. Que ce soit pour vérifier la validité des certificats, extraire des informations spécifiques, ou automatiser des tâches de surveillance, cette commande possède plusieurs options qui permettent d'être rapide et efficace.