Dans ce tutoriel, nous allons apprendre à extraire les informations d’un certificat à clé publique X.509 à l’aide de la sous-commande x509 de l’outil openssl.

Qu’est-ce qu’un certificat de clé publique X.509 ?

Dans les protocoles cryptographiques TLS et SSL, un certificat de clé publique est un certificat électronique qu’un site Web présente à l’utilisateur final. Grâce à ce certificat, un site Web peut prouver sa légitimité à ses visiteurs. Ces derniers peuvent alors interagir en toute confiance avec le site web.

X.509 est l’une des normes permettant de définir les certificats à clé publique. C’est celle qui est la plus utilisée sur Internet.

Que contient un certificat X.509 ?

Examinons un exemple de certificat X.509 :

Certificat :
Données :
Numéro de série :
24:4e:52:d9:6b:55:1f:96:0a:00:00:00:00:f2:ba:f4
Algorithme de signature : sha256WithRSAEncryption
Émetteur : C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
Validité
Pas avant : 12 juillet 01:35:31 2021 GMT
Pas après : Oct 4 01:35:30 2021 GMT
Sujet : CN = .google.com Informations sur la clé publique du sujet : Algorithme de clé publique : id-ecPublicKey Extensions X509v3 : Utilisation de la clé X509v3 : critical Signature numérique Utilisation de la clé étendue X509v3 : Authentification du serveur Web TLS Nom alternatif du sujet X509v3 : DNS:.google.com, DNS:.appengine.google.com, DNS:.bdn.dev,
…(tronqué)
Algorithme de signature : sha256WithRSAEncryption
c1:0b:9e:6b:58:ea:5f:31:c8:25:1a:49:b6:fc:dd:a6:46:73:
…(tronqué)

L’extrait de certificat ci-dessus concerne le site google.com. Il contient une variété d’informations.

Tout d’abord, chaque certificat contient un numéro de série. Il s’agit d’une valeur donnée par l’émetteur lorsqu’il signe le certificat.

L’émetteur du certificat est défini dans le champ Issuer. Pour ce certificat particulier, l’émetteur relève de l’organisation Google Trust Services LLC, qui réside aux États-Unis. En outre, l’émetteur a un nom commun de GTS CA 1C3.

Ensuite, le champ Validité définit la période pendant laquelle un certificat est effectif. En particulier, un certificat n’est valide que pendant la période définie par les champs Not Before et Not After.

Dans le champ Subject, nous pouvons voir que ce certificat a un nom commun de *.google.com. Il s’agit d’un nom commun joker qui permet à tous les sous-domaines de google.com de s’identifier en utilisant le même certificat. De plus, le champ Subject Public Key Info spécifie la clé publique de ce certificat. Sous ce même champ, le certificat définit également le type d’algorithme de la clé publique ainsi que les paramètres nécessaires.

Dans le champ X509v3 extensions, nous pouvons trouver plusieurs propriétés étendues qui sont sur la version 3 de la norme de certificat X.509. Par exemple, le champ X509v3 Subject Alternative Name définit les autres domaines qui s’authentifient à l’aide des mêmes certificats. En d’autres termes, ce certificat serait également valable pour les domaines *.cloud.google.com, *.appengine.google.com, et ainsi de suite.
freestar

Enfin, nous pouvons voir un champ Signature Algorithm suivi d’un bloc d’hexadécimal. Ce champ spécifie l’algorithme qui est utilisé lors de la signature. Dans ce cas, il s’agit du sha256WithRSAEncryption. En outre, le bloc d’hexadécimal est la signature signée par l’émetteur. La signature sert à s’assurer que les informations figurant sur le certificat n’ont pas été piétinées après avoir été vérifiées par l’autorité de certification.

L’outil open ssl

L’outil openssl est une bibliothèque de cryptographie qui met en œuvre les protocoles réseau SSL/TLS. Il contient différentes sous-commandes pour tous les besoins de communication SSL/TLS.

Par exemple, la sous-commande s_client est une implémentation d’un client SSL/TLS. En outre, la sous-commande x509 offre une variété de fonctionnalités pour travailler avec les certificats X.509.

Installation

La plupart des distributions Linux incluent la commande openssl. Si elle n’est pas disponible, nous pouvons l’installer en utilisant un gestionnaire de paquets.

Pour les Linux basés sur Debian, nous pouvons utiliser le gestionnaire de paquets apt-get :

$ sudo apt-get update
$ sudo apt-get install -y openssl

Pour les systèmes Linux basés sur RHEL, nous pouvons utiliser le gestionnaire de paquets yum :

$ sudo yum update
$ sudo yum install -y openssl

Et pour Alpine Linux, nous pouvons utiliser le gestionnaire de paquets apk :

$ sudo apk add openssl

Nous pouvons exécuter la sous-commande openssl version pour confirmer la réussite de l’installation :

$ openssl version
OpenSSL 1.1.1k 25 Mar 2021

Récupération du fichier de certificat de clé publique X.509

Disons que nous voulons récupérer le fichier de certificat de clé publique de google.com. Nous pouvons le faire en utilisant les sous-commandes s_client et x509 de openssl :

$ openssl s_client -connect google.com:443 -showcerts googlecert.pem

La connexion au port 443 de l’hôte google.com à l’aide de s_client initie la poignée de main TLS.

L’option -showcerts indique que nous voulons imprimer le certificat sur la sortie standard. La redirection de /dev/null vers l’entrée standard met fin à la connexion après l’obtention du certificat.

Nous envoyons ensuite le certificat à la sous-commande x509 avec l’option -outform pour l’encoder au format PEM. Enfin, nous enregistrons le fichier de certificat sous le nom de googlecert.pem.

Décodage du certificat entier

Les certificats au format PEM sont encodés en base64. Par exemple, voici le fichier googlecert.pem que nous avons obtenu précédemment :

$ cat googlecert.pem
—–DÉBUT DU CERTIFICAT—–
MIINUDCCDDigAwIBAgIQJE5S2WtVH5YKAAAAAPK69DANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
…(tronqué)
—–END CERTIFICAT—–

Pour décoder le certificat entier en texte clair, nous utilisons la commande x509 avec l’option -text :

$ openssl x509 -in googlecert.pem -noout -text
Certificat :
Données :
Version : 3 (0x2)
Numéro de série :
24:4e:52:d9:6b:55:1f:96:0a:00:00:00:00:f2:ba:f4
Algorithme de signature : sha256WithRSAEncryption
Émetteur : C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
Validité
Pas avant : 12 juillet 01:35:31 2021 GMT
Pas après : Oct 4 01:35:30 2021 GMT
…(tronqué)

Tout d’abord, l’option -in spécifie le fichier de certificat à décoder. Ensuite, l’option -noout empêche toute sortie de la commande. Sans l’option -noout, la commande retournera par défaut le certificat encodé en base64.

Enfin, nous spécifions l’option -text pour imprimer le certificat entier sous forme de texte brut.

Extraction d’informations spécifiques du certificat

À l’aide de la sous-commande x509, nous pouvons extraire différents champs du certificat.

Extraction de l’objet

L’option -subject de la sous-commande x509 nous permet d’extraire le sujet du certificat.

Extrayons les informations relatives au sujet du fichier googlecert.pem à l’aide de x509 :

$ openssl x509 -in googlecert.pem -noout -subject
subject=CN = *.google.com

Extraction de l’émetteur

Nous pouvons extraire les informations de l’émetteur d’un certificat en utilisant l’option -issuer.

Par exemple, pour extraire les informations de l’émetteur du fichier googlecert.pem :
freestar

$ openssl x509 -in googlecert.pem -noout -issuer
issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1C3

Extraction des champs d’extension

Pour obtenir les champs d’extension des certificats à clé publique X.509, nous pouvons utiliser l’option -ext.

Par exemple, en spécifiant l’option -ext suivie de subjectAltName, on obtient le nom alternatif du sujet dans le certificat :

$ openssl x509 -in googlecert.pem -noout -ext subjectAltName
Nom alternatif du sujet X509v3 :
DNS:.google.com, DNS:.appengine.google.com, DNS:.bdn.dev, DNS:.cloud.google.com, DNS:.crowdsource.google.com, DNS:.datacompute.google.com, …(tronqué)

De même, nous pouvons utiliser la même option pour obtenir le champ d’utilisation de la clé en utilisant l’argument keyUsage :

$ openssl x509 -in googlecert.pem -noout -ext keyUsage
Utilisation de la clé X509v3 : critical
Signature numérique

Formatage de la sortie du nom

Pour les résultats tels que l’émetteur et le sujet, nous pouvons également spécifier le format d’affichage en utilisant l’option -nameopt.

Par exemple, nous pouvons séparer les informations de l’émetteur en plusieurs lignes en utilisant l’option -nameopt suivie de l’opérateur sep_multiline :

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt sep_multiline
issuer=
C=US
O=Google Trust Services LLC
CN=GTS CA 1C3

Nous pouvons également afficher le nom long du champ au lieu de l’abréviation en passant l’opérateur lname à -nameopt :

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt lname
issuer=countryName=US, organizationName=Google Trust Services LLC, commonName=GTS CA 1C3

Enfin, l’option -nameopt peut être spécifiée plusieurs fois pour combiner le comportement de différents opérateurs. Par exemple, nous pouvons combiner les opérateurs lname et sep_multiline :

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt lname -nameopt sep_multiline
issuer=
countryName=US
organizationName=Google Trust Services LLC
commonName=GTS CA 1C3

La page de manuel de la commande openssl fournit une liste complète des arguments de formatage.
freestar

Extraction de la date de début et de la date d’expiration

Chaque certificat spécifie une date de début et une date d’expiration. Ces 2 dates sont importantes car un certificat n’est valable que pendant cette période.

Pour obtenir ces deux dates, nous pouvons spécifier l’option -dates :

$ openssl x509 -in googlecert.pem -noout -dates
notBefore=Jul 12 01:35:31 2021 GMT
notAfter=Oct 4 01:35:30 2021 GMT

Alternativement, nous pouvons imprimer seulement la date de début en utilisant l’option -startdate :

$ openssl x509 -in googlecert.pem -noout -startdate
notBefore=Jul 12 01:35:31 2021 GMT

De même, en utilisant l’option -enddate, nous pouvons obtenir la date d’expiration du certificat :

$ openssl x509 -in googlecert.pem -noout -enddate
notAfter=Oct 4 01:35:30 2021 GMT

Extraction d’autres informations

Chaque certificat possède une empreinte digitale qui est utilisée pour identifier de manière unique un certificat particulier.

Pour extraire l’empreinte digitale, nous pouvons exécuter la sous-commande x509 avec l’option -fingerprint :

$ openssl x509 -in googlecert.pem -noout -fingerprint
SHA1 Fingerprint=5E:0B:46:9E:55:07:70:5A:C3:40:12:66:06:89:9A:92:E8:C2:15:E4

En outre, nous pouvons obtenir le numéro de série d’un certificat en utilisant l’option -serial. Par exemple :

$ openssl x509 -in googlecert.pem -noout -serial
serial=244E52D96B551F960A00000000F2BAF4

Enfin, nous pouvons extraire la clé publique d’un certificat en utilisant l’option -pubkey :
freestar

$ openssl x509 -in googlecert.pem -noout -pubkey
—–DÉBUT DE LA CLÉ PUBLIQUE—–
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESDHX4ovWPfaIWPNZPCKJGTx7QjE5
0gifWTUyw+t7DkNvq+2nErrpWocdifYDOoX8E+63JdEFlrRwhu4jXZheYA==
—–END PUBLIC KEY—–

Vérifier si un certificat est sur le point d’expirer

L’option -checkend de la sous-commande x509 permet de vérifier rapidement si un certificat est sur le point d’expirer.

L’option prend un argument supplémentaire, n, dont l’unité est la seconde. En général :

$ openssl x509 -in -noout -checkend n

La commande ci-dessus va vérifier si le certificat expire dans les n prochaines secondes. Si c’est le cas, la commande renvoie un code d’état 1. La commande renvoie un code d’état 0 si le certificat donné n’expire pas dans les n prochaines secondes. En outre, la commande renvoie un message indiquant l’état d’expiration du certificat.

Par exemple, pour déterminer si un certificat expire dans les 60 prochaines secondes :

$ openssl x509 -in googlecert.pem -noout -checkend 60
Le certificat n’expirera pas
$ echo $ ?
0

La commande ci-dessus renvoie un code d’état de 0 car le certificat n’expire pas dans les 60 prochaines secondes.

Vérifions maintenant si le même certificat expirera dans les 20 prochaines semaines :

$ openssl x509 -in googlecert.pem -noout -checkend 12096000
Le certificat expirera
$ echo $ ?
1

Puisque le certificat expirera dans les 20 prochaines semaines, nous obtenons un code d’état de retour de 1.

Conclusion

Dans cet article, nous avons appris ce qu’est un certificat X.509, quelles données il contient et comment le récupérer à partir d’un site Web sur lequel nous travaillons.