142 views
# Certificats X.509 Objectif : empêcher une personne de se faire passer pour quelqu'un d'autre et faire man in the middle. - Assurer l'origine de la clef publique - Intervention d'un tiers de confiance - fournit un certificat - Autorité de certification racine qui emet pour les sous-autorité et ainsi de suite - Il peut signer ce qu'on veut (une clef, un timestamp, une info ...) ## Qu'est ce qu'un certif X509 ? [RFC 5280 - Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile](https://datatracker.ietf.org/doc/html/rfc5280) - document contenant : - **Issuer** → Autorité qui tamponne - **Subject** → Bob, celui à qui appartient la clé publique contenue - **Clé publique** → la clé publique - **Date de validité** → `notBefore`, `notAfter` - Conditions d'utilisation (ce qu'on peut faire faire au certif) ### Cryptoooo On fait un hash de tous ces champs, on le signe avec la clé privée de l’autorité de certification et on le concatène aux champs, c’est la Signature Emetteur du certificat Deux encodages - DER - Encodage binaire (structure spécifiée ASN.1) - PEM - Base64 du DER avec `---BEGIN CERTIFICATE---` et `---END CERTIFICATE---` ### Extensions Comme d'hab il manquait des trucs dans le standard donc voici quelques extensions importantes : - Basic Constraints - Est-ce que c’est un certificat qui appartient à une autorité de certification ? - a.k.a. est-ce que ça peut être utilisé - pour générer / signer de nouveaux certificats ? - pour assurer de la confidentialité ? - Pour signer autre chose ? - Subject Key Identifier - identifiant de la clef - Subject Alternative Name - Liste d’éléments pour donner le nom du possesseur du certificat - e.g. spécifier noms de domaines, des IP, etc. le navigateur pourra faire l’effort de vérifier que le certificat correspond bien. - Usage Etendu - Spécifier si on peut signer du CRL (Certificate Revocation List), signer des mails, chiffrer seulement, déchiffrer seulement, etc. - Donner une liste de trucs en plus pour lequel le certificat peut être utilisé ### Mettre un certificat hors service #### CRL : Certificate Revocation List Dans la CRL c’est l’ID du certificat qui est utilisé, pas le certificat en entier Même si les dates sont bonnes, etc., si l’identifiant d’un certificat est dans la CRL c’est ciao - entre le moment où - la clé a été volée - l’identifiant est ajouté à la CRL - on récupère la CRL #### OCSP : Online Certificate Status Protocol Il peut se passer beaucoup de temps donc pour répondre à ça. On a **OCSP**, un serveur qu’on peut interroger pour savoir si le certif est toujours valide - la CRL c’est pas dynamique, c’est une liste mise à jour *périodiquement* - serveur OCSP à interroger pour vérifier si un certificat est révoqué - on fait la vérification direct, on me donne un certificat je demande “il est valide?” oui/non, c’est direct, toujours à jour **Mais il faut une grande disponibilité du serveur OCSP** ### Certificate Transparency List CTL : Base de données (en ajout seulement) de tous les certificats signés des CA. Publique/accessible à tous. Pour pallier au scénario dans lequel la clé privée d’une CA est volée, l'attaquant peut forger un certficat *valide* 👉 Mais maintenant les outils *doivent* vérifier que le certificat existe dans la Certificate Transparency list - Si l’attaquant soumet le certificat forgé il va se faire flag (Diginotar est pas censé donner un certificat pour amazon.com par ex) - Si il le soumet pas ça va fail pcq les navigateurs, etc. doivent signer - Par contre si c’est la CA légitime (e.g. la CA Amazon qui tombe) ben c’est un peu plus chaud, et dans ce cas c’est le mécanisme de base de mettre à jour le truc