Nous allons voir comment se comporte Poezio lors d'une connexion SSL/TLS avec le serveur, avec sa configuration par défaut.

S'il n'y a pas d'empreinte de certificat stockée dans le fichier de config, alors Poezio va demander à l'utilisateur de valider l'empreinte du certificat reçu, au moment de la connexion. Puis, Poezio va stocker l'empreinte dans son fichier de config (logique). Au lancement suivant, il va comparer l'empreinte du certificat reçu lors de la connexion SSL/TLS, avec celle qu'il a stocké, pour voir si elles sont identiques.

L'utilisateur ne peut pas, ou difficilement, vérifier l'empreinte du certificat qu'on lui demande de valider. C'est génant pour le premier lancement. Mais, pour les lancements suivants, la seule information pertinante affichée par Poezio, est que le certificat a changé (s'il a vraiment changé).

Par défaut, le certificat n'est pas vérifié avec la base CA du système.

Cette façon de procéder peut sembler surprenante, pourtant elle est connue sous l'appellation Trust on first use. Elle est également mise en pratique par le protocole Gemini, un dérivé du HTTP.

Avantages :

  • Si le serveur XMPP utilise la même clé privée pendant 10 ans
  • Si le serveur utilise un certificat auto-signé
  • Si on utilise son propre serveur XMPP, on peut comparer le hash manuellement

Inconvéniants :

  • Il faut demander le hash à l'adminsys, si on est hébergé
  • Si la clé privée change tous les 6 mois, le hash change tous les 6 mois
  • Pas de vérification avec la base CA du système
  • Si on passe par Tor, cette méthode est inutilisable
  • Si on passe par n'importe quel réseau, ligne mobile, hotspot wifi, VPN bon marché

Comment récupérer l'empreinte coté serveur

Dans le cadre de mon audit, il a fallu trouver un moyen pour voir si le hash affiché par Poezio correspondait à la clé privée sur mon serveur. Puisque j'ai accès au serveur, j'ai pû retrouver exactement quel hash était affiché.

La commande suivante travaille sur la clé privée, mais plus précisément sur la partie "publique" de la clé. Elle est convertie au format DER, qui est un format binaire, puis renvoyée dans l'outil openssl-dgst, qui va faire le calcul en SHA256. Le résultat serait identique avec un pipeline vers la commande "sha256sum" :

$ openssl pkey -in file.key -pubout -outform DER | openssl dgst -sha256 -hex -c | awk '{ print toupper ($2) }'

Cette commande présente de nombreux inconvéniants : Il faut avoir accès au serveur en root, ou bien il faut envoyer un mail aux admins (et leur envoyer la commande). De plus, si la clé privée (le fichier .key) change une fois, il faut relancer la commande. Et si jamais, la clé privée change régulièrement (tous les 6 mois par exemple), il faut relancer la commande à chaque fois. Une fois encore, cette solution est difficilement exploitable sur le long-terme.

Empreinte chez casperlefantom.net

N'étant pas vraiment en accord avec la méthode TOFU/TUFU, je me suis dit que je pourrais mettre à disposition un moyen, pour que les utilisateurs puisse effectuer la vérification manuellement. Je me suis amusé à mettre en ligne un fichier statique qui contient toutes les informations.

Mon intuition est que jamais d'autres administrateurs feront pareil. La demande est tellement pointue, voyez plutôt :

https://dl.casperlefantom.net/pub/ssl/fingerprint-for-poezio-client.txt

Comment désactiver la vérification de l'empreinte du certificat

Dans la version 0.13.1 de Poezio, il est possible de désactiver la méthode par comparaison (méthode TOFU/TUFU), pour revenir à un système plus classique. Il suffit de modifier le fichier de config :

ignore_certificate = True

Ou bien, lancer la commande dans Poezio :

/set ignore_certificate True

Ensuite, il convient d'activer la vérification avec la base CA du système. Le chemin ci-après est valide, pour les systèmes Fedora Linux. Il est possible d'indiquer le chemin vers son CA personnel, si vous en avez un :

ca_cert_path = /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

Commande dans Poezio :

/set ca_cert_path /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

Enfin, on peut nettoyer le fichier de config en supprimant la ligne qui correspond à l'empreinte du certificat stockée par Poezio :

certificate = 78:2F:71:43:1F:9B...

Référence : TLS in poezio