Un certificat électronique est un fichier de données permettant :
Un certificat électronique comprend plusieurs informations, dont :
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 :
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.
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
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://www.vaadata.com/
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.
Pour résumer, un certificat est considéré comme valide quand :
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.
Une connexion chiffrée est établie de la manière suivante :
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).
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.
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.
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.
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.
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 :
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
Frida
Bibliographie :
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning