Certificats - Kasimashi/Systemes-embarques GitHub Wiki
Les certificats
Le problème principal dans les communications sécurisés : c'est que l'on n'a aucune garantie sur l'identité du serveur avec lequel on communique. N'importe qui peut générer un couple clé public / clé privé et commencer à chiffrer les informations avec le client. Il faut donc un moyen de s'assurer que le serveur est bien celui qui correspond au nom de domaine.
Pour cela on utilisera un système de certificats. Les certificats peuvent être assimilés à des cartes d'identité virtuelles. Comme dans la réalité ces cartes d'identité, une fois vérifiées, permettent de s'assurer que la personne que l'on a en face de nous est bien la bonne. Les certificats seront ainsi utilisés pour signer les clés publiques.
Ainsi un certificat permet d'associer une clé publique à une entité (une personne, une machine, ...) afin d'en assurer la validité. Le certificat est en quelque sorte la carte d'identité de la clé publique, délivré par un organisme appelé autorité de certification (souvent notée CA pour Certification Authority).
Les certificats portent l'extensions .der ou .pem ou encore .crt. On trouve l'extension .key pour les clefs privées.
Les certificats X509.v3
Généralement encodé en base64 (réversible et décodable), PEM, DER Hex ils contiennent les éléments suivants :
Exemple d'un certificat X509 (1024 bytes RSA):
-----BEGIN CERTIFICATE-----
MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG
A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE
MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl
YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw
ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE
CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs
ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD
+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9
MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1
C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ
kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf
jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr
evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=
-----END CERTIFICATE-----
En décodant ce certificat on obtient : (A l'aide de : https://gchq.github.io/CyberChef/#recipe=Parse_X.509_certificate('PEM') ou à l'aide de la commande openssl x509 -in certificate.crt -text -noout
)
Version: 1 (0x00)
Serial number: 3579 (0x0dfb)
Algorithm ID: SHA1withRSA
Validity
Not Before: 22/08/2012 05:27:23 (dd-mm-yyyy hh:mm:ss) (120822052723Z)
Not After: 21/08/2017 05:27:23 (dd-mm-yyyy hh:mm:ss) (170821052723Z)
Issuer
C = JP
ST = Tokyo
L = Chuo-ku
O = Frank4DD
OU = WebCert Support
CN = Frank4DD Web CA
E = [email protected]
Subject
C = JP
ST = Tokyo
O = Frank4DD
CN = www.example.com
Public Key
Algorithm: RSA
Length: 1024 bits
Modulus: c6:01:06:bc:79:3e:53:f4:58:d2:3f:65:dc:c3:fb:a3:
e4:b6:6b:ab:9f:e1:76:91:06:1b:b5:ce:d7:42:1f:3f:
2d:30:6f:0a:8f:8f:ea:26:68:2c:49:94:03:d7:bb:11:
72:d1:c6:05:35:09:5a:9e:02:2e:d0:70:09:fd:33:00:
65:73:c9:2c:14:91:c1:d2:bb:5f:f6:99:9f:f0:ec:da:
f4:4d:01:ca:79:6a:ff:8f:ca:6f:5c:7e:77:e0:32:84:
be:e8:2b:db:50:c0:1d:b8:b8:73:ae:78:78:b5:0b:f8:
95:bf:c0:92:58:a8:98:7b:a8:73:37:5b:71:61:ef:2b
Exponent: 65537 (0x10001)
Certificate Signature
Algorithm: SHA1withRSA
Signature: 01:23:dd:8e:28:09:91:70:aa:29:6a:67:67:f3:9c:ef:
91:14:70:c8:ba:1f:3b:5a:5b:c6:9b:50:c9:58:5c:f2:
20:91:5d:85:ed:86:a7:1c:e0:7b:2b:87:fb:38:e2:e3:
8b:3f:03:4c:f1:5f:8c:2f:54:7a:e1:2b:85:a0:3f:cf:
35:a2:f1:ec:0c:4c:56:56:fd:6b:21:3a:b9:b7:7c:db:
dc:32:b3:0b:2a:d1:f9:df:82:4a:bd:c7:4c:83:aa:88:
76:34:c5:20:d2:2b:7a:f9:c0:85:fd:1c:c1:42:da:79:
b9:fe:94:cb:3c:3d:d9:7b:cb:7e:fe:b1:f9:6e:56:89
Extensions
Dans l'exemple ci dessus : on remarque qu'il possède une signature (parfois noté thumbprint): cette signature est rajoutée par l'autorité de certification
S est calculée à partir de la clef privée de l'autorité de certification ( $Kpriv_{AC}$ ) dans l'exemple ci dessus : $S = RSA(SHA1[Contenu])Kpriv_{AC}$
Vérification du certificat :
Lorsqu'un utilisateur désire communiquer avec une autre personne, il lui suffit de se procurer le certificat du destinataire. Ce certificat contient le nom du destinataire, ainsi que sa clé publique et est signé par l'autorité de certification. Il est donc possible de vérifier la validité du message en appliquant d'une part la fonction de hachage aux informations contenues dans le certificat, en déchiffrant d'autre part la signature de l'autorité de certification avec la clé publique de cette dernière et en comparant ces deux résultats.
Dans l'exemple ci dessus utiliser la clef publique de l'autorité de certificat revient à obtenir : $SHA1[Contenu]$
Signature de certificats
On distingue différents types de certificats selon le niveau de signature :
- Les certificats auto-signés sont des certificats à usage interne. Signés par un serveur local, ce type de certificat permet de garantir la confidentialité des échanges au sein d'une organisation, par exemple pour le besoin d'un intranet. Il est ainsi possible d'effectuer une authentification des utilisateurs grâce à des certificats auto-signés.
- Les certificats signés par un organisme de certification sont nécessaires lorsqu'il s'agit d'assurer la sécurité des échanges avec des utilisateurs anonymes, par exemple dans le cas d'un site web sécurisé accessible au grand public. Le certificateur tiers permet d'assurer à l'utilisateur que le certificat appartient bien à l'organisation à laquelle il est déclaré appartenir.
Certificat digne de confiance
Les certificats sur les machines respectives client et serveur dans des dossiers portant le nom suivants
- Own : Dossier de stockage de ses propres certificats
- Trusted : Certificat extérieur accepté digne de confiance
- Rejected : Certificat extérieur rejeté
Révocation du certificat
La révocation consiste à ne plus croire le certificat pour plusieurs raisons :
- La date du certificat est expirée
- La clef privée a été compromise ou perdu
- Usage illicite
- Un utilisateur a quitté le poste
- (...)
Pour vérifier la révocation d'un certificat on utilise un CRL (Certificate Revocation List). Cela se fait à partir soit à partir :
- d'une URL public et connu par exemple : https://toto.com/CertificateRevoc.crl
- en téléchargeant la liste des certificats révoqués
- de l'URI : CRL Distribution Points (CDP)
- d'une URL contenue dans le certificat racine
- d'une URL contenue dans le certificat
Pour ouvrir un fichier crl on peux le faire avec openssl via la commande openssl crl -inform DER -text -noout -in mycrl.crl