OpenSSL : Analyser les informations d'un certificat X.509
Sommaire
Bonjour à tous ! Aujourd'hui un autre article sur OpenSSL, nous allons voir ensemble comment récupérer et analyser toutes les informations d'un certificat x509 : numéro de série, DN du l'autorité, DN du certificat, etc.
Introduction
Dernièrement nous avons beaucoup parlé des certificats sur ce blog : générer des certificats/CSR avec des SANs, vérifier l'appartenance d'une clé à un certificat... Mais nous n'avons jamais abordé la partie la plus basique : quelles sont les informations contenues par un certificat et surtout, comment les lire et les comprendre.
J'avais déjà réalisé cet exercice mais dans une présentation, qui est disponible ici.
Certificat x509 ?
Lorsque l'on aborde les certificats SSL/TLS, le format utilisé est X.509 en version 3. x509 est une norme qui permet de spécifier les formats pour les certificats à clé publique. Si cela vous intéresse, vous trouverez toutes les informations concernant ce format dans les RFC5280 et RFC2459.
Tout ce que vous devez savoir c'est que cette norme X.509 qui donne la structure des certificats que nous utilisons tous les jours.
Structure d'un certificat X.509
La structure d'un certificat est disponible dans la RFC2459 et nous retrouvons les éléments suivants :
- Version
- Numéro de série
- Algorithme de signature du certificat
- DN : Distinguished name de l'autorité ou du délivreur
- Validité
- Pas avant
- Pas après
- DN de l'objet du certificat
- Informations sur la clé publique
- Algorithme de la clé publique
- Clé publique
- Extensions
- Liste des extensions (SAN, etc.)
- Signature des informations par l'autorité de certification
Nous allons maintenant voir comment se traduisent ses informations dans la pratique.
Analyse des informations d'un certificat
Comme exemple je vais prendre le certificat utilisé pour ce blog, qui utilise des SAN et d'autres extensions.
Pour cela, on va récupérer toutes les informations avec la commande suivante :
openssl x509 -in certificate.crt -text -noout
Ce qui nous donne comme résultat :
1Certificate:
2 Data:
3 Version: 3 (0x2)
4 Serial Number:
5 03:aa:0a:46:5d:c8:67:1c:3c:8d:f8:9e:b6:fc:c5:52:3e:e0
6 Signature Algorithm: sha256WithRSAEncryption
7 Issuer: C = US, O = Let's Encrypt, CN = R3
8 Validity
9 Not Before: May 6 18:03:27 2024 GMT
10 Not After : Aug 4 18:03:26 2024 GMT
11 Subject: CN = net-security.fr
12 Subject Public Key Info:
13 Public Key Algorithm: rsaEncryption
14 Public-Key: (2048 bit)
15 Modulus:
16 00:ae:81:84:f8:e1:7f:e0:83:34:cf:0f:06:f5:37:
17 5a:6b:35:cd:20:7b:43:dc:26:9b:60:75:27:b4:40:
18 ea:85:29:94:89:93:8d:95:ff:b0:a6:0a:22:25:b2:
19 ef:e2:ae:2d:5e:bf:22:62:15:50:2b:3b:5f:9c:73:
20 34:3f:0d:ee:55:1c:66:62:c7:d3:57:e6:c9:cd:85:
21 1f:2d:41:6d:67:c1:b7:2a:eb:cf:9f:7d:17:e2:30:
22 49:df:54:67:04:41:e4:2b:8a:63:9e:dc:a6:d7:65:
23 8c:54:1a:40:df:6d:7a:64:2d:43:77:af:e1:5c:14:
24 ed:b7:94:ff:ce:6b:db:a6:15:91:9d:e1:64:a2:94:
25 29:f2:06:49:00:e8:95:66:f2:f9:1f:2d:91:63:32:
26 fe:08:f3:9b:e7:f0:e3:4b:fb:46:4b:f7:1f:42:05:
27 18:6a:29:e0:40:00:1b:ef:09:7b:7a:94:30:fd:ab:
28 79:6c:7e:22:b8:c3:4c:b4:bd:24:b7:24:37:fa:99:
29 7d:28:de:3d:33:ed:a8:12:11:43:02:f7:cc:a5:51:
30 4e:be:ca:5a:44:3e:79:bf:cf:cf:51:1e:fd:cd:ee:
31 99:c9:0c:c0:b2:81:ef:df:1b:d4:b2:6a:e3:bf:c9:
32 6f:c1:99:54:fa:58:e6:58:b6:6b:d4:3a:e2:4d:b7:
33 16:1f
34 Exponent: 65537 (0x10001)
35 X509v3 extensions:
36 X509v3 Key Usage: critical
37 Digital Signature, Key Encipherment
38 X509v3 Extended Key Usage:
39 TLS Web Server Authentication, TLS Web Client Authentication
40 X509v3 Basic Constraints: critical
41 CA:FALSE
42 X509v3 Subject Key Identifier:
43 CE:22:C3:D8:02:10:09:AD:C4:3F:18:75:FD:C6:8E:22:0F:12:FD:89
44 X509v3 Authority Key Identifier:
45 14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6
46 Authority Information Access:
47 OCSP - URI:http://r3.o.lencr.org
48 CA Issuers - URI:http://r3.i.lencr.org/
49 X509v3 Subject Alternative Name:
50 DNS:links.tzku.at, DNS:net-security.fr, DNS:tzku.at, DNS:www.net-security.fr, DNS:www.tzku.at
51 X509v3 Certificate Policies:
52 Policy: 2.23.140.1.2.1
53 CT Precertificate SCTs:
54 Signed Certificate Timestamp:
55 Version : v1 (0x0)
56 Log ID : 19:98:10:71:09:F0:D6:52:2E:30:80:D2:9E:3F:64:BB:
57 83:6E:28:CC:F9:0F:52:8E:EE:DF:CE:4A:3F:16:B4:CA
58 Timestamp : May 6 19:03:27.604 2024 GMT
59 Extensions: none
60 Signature : ecdsa-with-SHA256
61 30:45:02:21:00:D7:0A:0C:7D:AB:33:2D:50:A2:12:79:
62 CF:67:06:09:91:13:6C:EF:6A:7D:10:51:9C:95:EB:CC:
63 CD:C4:03:0C:16:02:20:6E:C3:C2:E6:E5:D8:F9:FE:03:
64 7B:3B:B3:FF:9C:3D:83:57:0C:4C:2E:99:D6:92:AD:0E:
65 C6:44:61:E7:2E:EA:BF
66 Signed Certificate Timestamp:
67 Version : v1 (0x0)
68 Log ID : 76:FF:88:3F:0A:B6:FB:95:51:C2:61:CC:F5:87:BA:34:
69 B4:A4:CD:BB:29:DC:68:42:0A:9F:E6:67:4C:5A:3A:74
70 Timestamp : May 6 19:03:27.669 2024 GMT
71 Extensions: none
72 Signature : ecdsa-with-SHA256
73 30:45:02:20:32:A1:D9:FB:21:1E:C0:1F:43:B8:21:33:
74 AA:9E:63:64:3B:20:EF:4C:21:94:88:42:B0:70:28:A7:
75 44:47:9B:FD:02:21:00:D7:17:F9:02:C7:C8:0A:F7:ED:
76 2F:B1:1F:F8:8C:41:A1:4B:DF:80:14:B0:BF:7D:F7:8B:
77 F9:C2:65:77:85:53:82
78 Signature Algorithm: sha256WithRSAEncryption
79 Signature Value:
80 29:70:b0:0a:11:f4:96:6e:63:be:d5:c6:a7:15:41:f6:bd:08:
81 ac:ad:49:22:c1:7f:8d:8e:49:aa:76:d6:18:e9:67:cd:76:c8:
82 32:71:eb:29:b2:4b:cb:f9:07:3b:36:c9:99:a9:d2:ca:ba:5b:
83 06:0f:62:af:7f:c9:72:28:09:9f:8c:68:d6:6e:1a:97:87:fc:
84 15:c3:19:33:d6:c1:cb:b5:b8:dc:f5:30:85:48:47:3e:ce:f4:
85 9a:63:91:af:fd:67:6b:74:ad:da:d9:29:2d:b2:d3:68:01:da:
86 df:74:13:74:1b:a0:cf:f8:06:c3:0b:52:fa:f6:29:f4:2d:d8:
87 78:c9:fb:f4:15:b5:6a:83:5b:3e:1d:df:d0:15:ba:1c:a3:a8:
88 94:28:ff:d8:8f:92:bf:98:3f:40:a3:10:0a:11:92:5e:82:d5:
89 b9:04:04:d9:ce:64:fd:44:c5:a6:9f:cf:8b:06:04:07:aa:45:
90 f0:ae:c6:65:e0:36:9c:39:b2:d4:d8:97:c9:e4:7e:18:dc:19:
91 1d:29:76:31:8a:53:bc:b4:97:00:ff:f6:16:f6:8b:e0:ae:97:
92 70:40:81:47:22:b0:3f:cf:50:3d:06:90:82:97:d7:9b:df:e4:
93 d9:8a:18:fd:93:f8:f5:00:bd:60:09:6a:5e:3c:09:7a:10:4e:
94 4d:1b:1e:bd
Nous retrouvons toutes les informations listées dans la structure juste au dessus. Nous allons les passer en revue une par une.
Version
Cette section comporte seulement la version de la norme X.509 utilisée. Globalement, c'est la version 3 qui est largement utilisée aujourd'hui.
Cela se traduit par la ligne suivante :
Version: 3 (0x2)
Numéro de série
Le numéro de série est donné directement par l'autorité de certification. De son côté c'est un numéro unique qui permet d'identifier le certificat. Si vous générez des certificats auto-signé, ce champ n'a pas d'importance.
Cela se traduit par la ligne suivante :
1Serial Number:
2 03:aa:0a:46:5d:c8:67:1c:3c:8d:f8:9e:b6:fc:c5:52:3e:e0
Algorithme de signature du certificat
Cette section va contenir les algorithmes utilisés pour signer notre certificat. Cela va dépendre de la méthode de signature utilisé par l'autorité de certification. Dans mon cas, via Let's Encrypt c'est sha256 avec RSA qui est utilisé.
Nous retrouvons la ligne suivante :
Signature Algorithm: sha256WithRSAEncryption
DN : Distinguished name de l'autorité de certification
Comme nous avons un DN sur notre certificat, l'autorité en possède un également. Il permet de donner plusieurs informations : le pays (C), l'organisation (O), le common name (CN). Dans cette section nous retrouvons toutes les informations relatives à l'autorité qui a signé notre certificat. C'est un élément important pour vérifier d'où vient notre certificat.
La ligne concernée est la suivante :
Issuer: C = US, O = Let's Encrypt, CN = R3
Validité
Cette section est très importante car c'est ici que nous retrouvons la durée de vie de notre certificat. Qui se traduit toujours avec 2 éléments : pas avant et pas après.
Car il est possible de générer un certificat qui n'est pas encore valide (mais qui le sera demain).
Voici les lignes :
1Validity
2 Not Before: May 6 18:03:27 2024 GMT
3 Not After : Aug 4 18:03:26 2024 GMT
DN de l'object du certificat
C'est la section la plus commune ou vous allez retrouver les informations de votre certificat : CN, O, L, C. Et c'est un bon exemple ici car cela permet de montrer que tous ces éléments sont optionnels ils sont recommandés pour la traçabilité et l'identification mais dans mon cas, nous avons seulement l'object CN.
Voici la ligne dans mon exemple :
Subject: CN = net-security.fr
Informations sur la clé publique
Ici on retrouve plusieurs informations relatives à la clé publique de notre certificat. Par exemple :
- La taille de la clé
- La méthode de chiffrement
- Le modulo (dans le cadre de RSA)
Voici les lignes concernées :
1Subject Public Key Info:
2 Public Key Algorithm: rsaEncryption
3 Public-Key: (2048 bit)
4 Modulus:
5 00:ae:81:84:f8:e1:7f:e0:83:34:cf:0f:06:f5:37:
6 5a:6b:35:cd:20:7b:43:dc:26:9b:60:75:27:b4:40:
7 ea:85:29:94:89:93:8d:95:ff:b0:a6:0a:22:25:b2:
8 ef:e2:ae:2d:5e:bf:22:62:15:50:2b:3b:5f:9c:73:
9 34:3f:0d:ee:55:1c:66:62:c7:d3:57:e6:c9:cd:85:
10 1f:2d:41:6d:67:c1:b7:2a:eb:cf:9f:7d:17:e2:30:
11 49:df:54:67:04:41:e4:2b:8a:63:9e:dc:a6:d7:65:
12 8c:54:1a:40:df:6d:7a:64:2d:43:77:af:e1:5c:14:
13 ed:b7:94:ff:ce:6b:db:a6:15:91:9d:e1:64:a2:94:
14 29:f2:06:49:00:e8:95:66:f2:f9:1f:2d:91:63:32:
15 fe:08:f3:9b:e7:f0:e3:4b:fb:46:4b:f7:1f:42:05:
16 18:6a:29:e0:40:00:1b:ef:09:7b:7a:94:30:fd:ab:
17 79:6c:7e:22:b8:c3:4c:b4:bd:24:b7:24:37:fa:99:
18 7d:28:de:3d:33:ed:a8:12:11:43:02:f7:cc:a5:51:
19 4e:be:ca:5a:44:3e:79:bf:cf:cf:51:1e:fd:cd:ee:
20 99:c9:0c:c0:b2:81:ef:df:1b:d4:b2:6a:e3:bf:c9:
21 6f:c1:99:54:fa:58:e6:58:b6:6b:d4:3a:e2:4d:b7:
22 16:1f
23 Exponent: 65537 (0x10001)
Extensions
Dans cette partie nous retrouvons toutes les extensions X.509 qui sont utilisées par notre certificat. Il en existe un très grand nombre mais parmi les plus courantes :
- Utilisation de SAN (Subject Alternative Name)
- Utilisation de certificat "client"
- Utilisation de certificat "serveur"
- Extension pour utiliser le certificat pour en signer d'autre
- Etc.
Ces lignes sont concernées :
1 X509v3 extensions:
2 X509v3 Key Usage: critical
3 Digital Signature, Key Encipherment
4 X509v3 Extended Key Usage:
5 TLS Web Server Authentication, TLS Web Client Authentication
6 X509v3 Basic Constraints: critical
7 CA:FALSE
8 X509v3 Subject Key Identifier:
9 CE:22:C3:D8:02:10:09:AD:C4:3F:18:75:FD:C6:8E:22:0F:12:FD:89
10 X509v3 Authority Key Identifier:
11 14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6
12 Authority Information Access:
13 OCSP - URI:http://r3.o.lencr.org
14 CA Issuers - URI:http://r3.i.lencr.org/
15 X509v3 Subject Alternative Name:
16 DNS:links.tzku.at, DNS:net-security.fr, DNS:tzku.at, DNS:www.net-security.fr, DNS:www.tzku.at
17 X509v3 Certificate Policies:
18 Policy: 2.23.140.1.2.1
19 CT Precertificate SCTs:
20 Signed Certificate Timestamp:
21 Version : v1 (0x0)
22 Log ID : 19:98:10:71:09:F0:D6:52:2E:30:80:D2:9E:3F:64:BB:
23 83:6E:28:CC:F9:0F:52:8E:EE:DF:CE:4A:3F:16:B4:CA
24 Timestamp : May 6 19:03:27.604 2024 GMT
25 Extensions: none
26 Signature : ecdsa-with-SHA256
27 30:45:02:21:00:D7:0A:0C:7D:AB:33:2D:50:A2:12:79:
28 CF:67:06:09:91:13:6C:EF:6A:7D:10:51:9C:95:EB:CC:
29 CD:C4:03:0C:16:02:20:6E:C3:C2:E6:E5:D8:F9:FE:03:
30 7B:3B:B3:FF:9C:3D:83:57:0C:4C:2E:99:D6:92:AD:0E:
31 C6:44:61:E7:2E:EA:BF
32 Signed Certificate Timestamp:
33 Version : v1 (0x0)
34 Log ID : 76:FF:88:3F:0A:B6:FB:95:51:C2:61:CC:F5:87:BA:34:
35 B4:A4:CD:BB:29:DC:68:42:0A:9F:E6:67:4C:5A:3A:74
36 Timestamp : May 6 19:03:27.669 2024 GMT
37 Extensions: none
38 Signature : ecdsa-with-SHA256
39 30:45:02:20:32:A1:D9:FB:21:1E:C0:1F:43:B8:21:33:
40 AA:9E:63:64:3B:20:EF:4C:21:94:88:42:B0:70:28:A7:
41 44:47:9B:FD:02:21:00:D7:17:F9:02:C7:C8:0A:F7:ED:
42 2F:B1:1F:F8:8C:41:A1:4B:DF:80:14:B0:BF:7D:F7:8B:
43 F9:C2:65:77:85:53:82
On retrouve bien les SANs par exemple. On voit également la partie liée à la Certificate Transparency avec la section CT Precertificate SCTs
.
Signature des informations par l'autorité de certification
Pour terminer, nous retrouvons la dernière partie relative à la signature des différentes informations de notre certificat par l'autorité de certification.
On retrouve donc l'algorithme de signature ainsi que la signature en elle même :
1 Signature Algorithm: sha256WithRSAEncryption
2 Signature Value:
3 29:70:b0:0a:11:f4:96:6e:63:be:d5:c6:a7:15:41:f6:bd:08:
4 ac:ad:49:22:c1:7f:8d:8e:49:aa:76:d6:18:e9:67:cd:76:c8:
5 32:71:eb:29:b2:4b:cb:f9:07:3b:36:c9:99:a9:d2:ca:ba:5b:
6 06:0f:62:af:7f:c9:72:28:09:9f:8c:68:d6:6e:1a:97:87:fc:
7 15:c3:19:33:d6:c1:cb:b5:b8:dc:f5:30:85:48:47:3e:ce:f4:
8 9a:63:91:af:fd:67:6b:74:ad:da:d9:29:2d:b2:d3:68:01:da:
9 df:74:13:74:1b:a0:cf:f8:06:c3:0b:52:fa:f6:29:f4:2d:d8:
10 78:c9:fb:f4:15:b5:6a:83:5b:3e:1d:df:d0:15:ba:1c:a3:a8:
11 94:28:ff:d8:8f:92:bf:98:3f:40:a3:10:0a:11:92:5e:82:d5:
12 b9:04:04:d9:ce:64:fd:44:c5:a6:9f:cf:8b:06:04:07:aa:45:
13 f0:ae:c6:65:e0:36:9c:39:b2:d4:d8:97:c9:e4:7e:18:dc:19:
14 1d:29:76:31:8a:53:bc:b4:97:00:ff:f6:16:f6:8b:e0:ae:97:
15 70:40:81:47:22:b0:3f:cf:50:3d:06:90:82:97:d7:9b:df:e4:
16 d9:8a:18:fd:93:f8:f5:00:bd:60:09:6a:5e:3c:09:7a:10:4e:
17 4d:1b:1e:bd
Conclusion
Et voilà, nous venons de voir rapidement tous les éléments/champs d'un certificat X.509v3.
J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ! N’hésitez pas à me dire également si ce genre d’article vous plaît !
Merci pour votre lecture et à bientôt !
Mickael Rigonnaux @tzkuat