Introduction au certificat électronique

Un certificat électronique est un fichier de données permettant :

  • la non-répudiation et l’intégrité des données,
  • d’identifier et d’authentifier une personne ou une organisation,
  • et de chiffrer des communications. 

Un certificat électronique comprend plusieurs informations, dont :

  • une clé publique
  • des informations d’identification
  • une durée de validité
  • un émetteur qui signe le certificat

Ce dernier point est crucial pour vérifier la confiance d’un certificat. Pour cela, quand un certificat est récupéré, une chaine de confiance est construite jusqu’à une autorité de certification.

Pour expliquer le fonctionnement de la chaine de confiance, introduisons quelques notions :

Autorité de certification

Une autorité de certification (AC, ou en anglais Certificate autority, CA) est un tiers de confiance qui émet des certificats électroniques et qui met aussi à disposition du public un moyen de vérifier les certificats qu’elle fournit.  C’est grâce à l’autorité de certification que nous pouvons savoir si un certificat a été révoqué ou est valide. 

Certificat racine

Un certificat racine est un certificat électronique autosigné qui identifie une autorité de certification.  Les navigateurs modernes et les systèmes d’exploitation incluent une liste de certificat racine et donc une liste d’autorités de certification.

Par exemple dans Firefox nous pouvons voir la liste des autorités de certification dans : Options > Vie privé et sécurité > Certificat > Afficher les certificats

Liste Autorités certification

Chaine de confiance

Pour établir une chaine de confiance, il suffit de regarder les émetteurs des certificats jusqu’à remonter à un certificat racine. Ensuite, si celui-ci est inclus dans le navigateur ou l’appareil, la chaine de confiance est établie.

Prenons par exemple le site https://vaadata.com/

Certificat Vaadata

Nous voyons que le certificat a été délivré par Sectigo RSA Extended Validation Secure Server CA.  Il s’agit donc d’une autorité de certificat (visible avec le CA). La chaine de confiance de Vaadata a bien été établie.

Certificat Vaadata - details
Detail du certificat

Pour résumer, un certificat est considéré comme valide quand :

  1. Le certificat n’a pas expiré, c’est-à-dire que nous sommes dans la durée de validité
  2. Une chaine de confiance a été établie
  3. Le certificat n’a pas été révoqué

Cependant, un des points faibles de ce fonctionnement est que, si un élément de la chaine de confiance est compromis, celui-ci peut délivrer des certificats frauduleux. 

Connexion chiffrée

Une connexion chiffrée est établie de la manière suivante :

  1. Le navigateur demande une connexion sécurisée au serveur
  2. Le serveur envoie son certificat au client
  3. Le client vérifie le certificat
  4. Si celui-ci est valide, le client envoie une clé de chiffrement unique au serveur, clé chiffrée avec la clé publique du serveur contenu dans le certificat.
  5. Le serveur déchiffre la clé unique avec sa clé privée
  6. Le serveur et le client disposent maintenant d’une clé unique leur permettant de chiffrer et déchiffrer leurs communications grâce à la clé unique.
Schéma connexion chiffrée

Plaçons-nous maintenant dans le cas de l’utilisation d’un proxy ou dans le cas d’une attaque man-in-the-middle (attaque de l’homme du milieu).

  1. Le client demande une connexion sécurisée au proxy
  2. Le proxy envoie son certificat au navigateur
  3. Le client vérifie le certificat du proxy
  4. Si celui-ci est valide, le client envoie une clé de chiffrement unique au proxy, clé chiffrée avec la clé publique du proxy contenu dans le certificat.
  5. Le proxy déchiffre la clé unique avec sa clé privée
  6. Le proxy et le client disposent maintenant d’une clé unique leur permettant de chiffrer et déchiffrer leurs communications grâce à la clé unique.
  7. Le proxy demande une connexion sécurisée au serveur
  8. Le serveur envoie son certificat au proxy
  9. Le proxy vérifie le certificat
  10. Si celui-ci est valide, le proxy envoie une clé de chiffrement unique au serveur, clé chiffrée avec la clé publique du serveur contenu dans le certificat.
  11. Le serveur déchiffre la clé unique avec sa clé privée
  12. Le proxy et le serveur disposent maintenant d’une clé unique leur permettant de chiffrer et déchiffrer leurs communications grâce à la clé unique.
Connexion chiffrée avec proxy - schéma

Pour que ce cas d’utilisation fonctionne, il est nécessaire que le proxy ou l’attaquant dispose d’un certificat valide. 

Dans le cas d’un proxy, un certificat racine peut être installé pour certifier le proxy. Dans le cas d’un attaquant, celui-ci peut avoir un certificat valide si un maillon de la chaine de confiance a été compromis. L’attaquant peut aussi trouver le moyen d’installer un certificat racine qu’il aura généré, sur l’ordinateur de sa cible. 

Certificate pinning, Key Pinning et Hash

Pour être certain de communiquer de manière sécurisée avec le bon serveur, et donc de se prémunir d’une attaque man-in-the middle, certaines méthodes existent. Nous allons donc les décrire ci-dessous.

Certificate Pinning 

Quand l’application reçoit le certificat envoyé par le serveur, elle le compare avec le certificat qu’elle embarque.  Si le résultat de la comparaison entre les deux certificats est différent, la communication chiffrée échoue. 

L’utilisation d’un certificat de pinning est, la plupart du temps, observée dans le cas d’une application mobile, car il est facile pour le développeur d’inclure le certificat attendu.

Quand le certificat est arrivé à expiration, l’application devra être mise à jour pour insérer le nouveau certificat valide. Ceci est l’inconvénient de cette méthode : si un service change régulièrement son certificat, l’application devra régulièrement être mise à jour. 

Public Key Pinning

Cette méthode consiste à épingler une clé publique à la place d’un certificat. La clé publique épinglée est ensuite comparée avec la clé publique extraite du certificat.

Hachage

Une autre technique est de comparer des hashs d’information à la place du certificat, ou des clés publiques. Cette méthode possède de nombreux avantages, par exemple :

  • Le hash permet d’anonymiser les informations hachées, en effet il est théoriquement impossible de retrouver des informations à partir d’un hash (sous réserve d’utiliser une bonne fonction de hachage comme sha256 ou sha3). Ceci peut permettre d’avoir un certificat ou une clé de réserve qui n’est pas divulgué publiquement.
  • Faciles d’utilisation, de nombreuses bibliothèques fournissent une empreinte digitale de certificat.

Conclusion

Les méthodes décrites précédemment permettent de renforcer la sécurité des communications chiffrées. Cependant, celles-ci sont loin d’être infaillibles. En effet, de nombreux outils existent pour les contourner facilement. Il existe par exemple l’application ssl-kill-switch sur iOS. Pour Android, il est possible d’utiliser des scripts Frida. 

Le coût d’implémentation de ces solutions apparait comme relativement élevé pour le gain de sécurité qu’elles apportent. Ces protections s’adressent donc plutôt aux applications manipulant des données sensibles, telles que les applications bancaires.

Pour aller plus loin :
Ssl-kill-switch 2 : https://github.com/nabla-c0d3/ssl-kill-switch2
Frida : https://frida.re/
Bibliographie :
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning