Imaginons qu'une clé que l'on vient de télécharger (à partir d'un serveur de clés) ne soit pas réellement la clé de la personne à laquelle on pense, mais qu'elle a été substituée par une tierce personne mal intentionnée.
Si on envoie un message chiffré en utilisant cette clé, cette tierce personne aura accès à notre message en clair. Il pourra le ré-émettre, après l'avoir lu, en le chiffrant avec la clé réelle du destinataire.
Total : une personne aura lu le message sans qu'aucune des deux extrémités ne soit au courant.
Le fait de télécharger une clé à partir d'un serveur ne garantit pas son authenticité.
Par exemple, si on reçoit un message chiffré provenant soi-disant de Philip Zimmermann (le créateur de PGP), alors on ira chercher sa clé sur les serveurs, et on pourrait penser que le message que l'on déchiffrera sera authentique. Cependant, beaucoup de fausses clés de Zimmermann circulent, qui sont en fait autant de contrefaçons.
Conclusion : il va falloir être en mesure d'authentifier toutes ces clés.
Pour l'instant, les différentes clés qu'on a pu récupérer par l'intermédiaire des serveurs de clés sont à vrai dire inutilisables, car elles ne sont pas suffisamment sûres.
Nous allons donc utiliser des mécanismes de signature des clés, et de contre-signature.
Il est possible de générer une empreinte (fingerprint) des différentes clés de son trousseau, par exemple de la sienne :
$ gpg --fingerprint guyeux pub 1024D/347AE5F2 2007-12-10 Empreinte de la clé = 6F8D 2FE4 8FF1 4A96 C8B4 06F3 49B7 113F 347A E5F2 uid Christophe Guyeux <guyeux@iut-bm.univ-fcomte.fr> sub 2048g/A40D23C8 2007-12-10
On peut alors noter sur un support facilement transportable (typiquement, une carte de visite) le fingerprint correspondant à sa propre clé publique.
Lorsqu'on va rencontrer physiquement une personne avec qui on sera susceptible d'avoir des échanges utilisant GnuPG ou PGP, alors on s'échangera ses fingerprints mutuels.
L'échange doit comporter une vérification de l'identité réelle de la personne, grâce aux papiers d'identité par exemple.
Une fois qu'on a récupéré le fingerprint de la personne, on peut télécharger la clé publique à partir d'un serveur : les 8 derniers caractères du fingerprint correspondent à l'ID de la clé publique.
En relançant la commande
gpg --fingerprint
on aura l'empreinte correspondant à la clé téléchargée.
Il ne restera plus qu'à comparer le fingerprint obtenu et celui marqué sur la carte de visite.
Pour l'instant, on ne peut donc utiliser GnuPG qu'avec des personnes qu'on aurait rencontré physiquement.
C'est là qu'entrent en jeu deux mécanismes :
On va donc contre-signer la clé publique que l'on vient de télécharger.
La clé publique de notre trousseau va être légèrement modifiée.
On va en effet y ajouter un petit morceau de signature propre à nous, généré par notre clé secrète.
On attestera ainsi qu'on est d'accord sur le fait que cette clé publique appartient bien à son propriétaire : quiconque, nous faisant confiance, pourra donc aussi avoir confiance en ladite clé.
Il suffit d'utiliser la commande
$ gpg --sign-key idPersonne
Si la personne possède plusieurs UIDs, il est possible de les signer tous ou de choisir ceux qu'on veux signer.
Il ne faut jamais signer une clé sur la bonne foi d'une tierce personne ou si une personne a envoyé son fingerprint par mail, etc.
La signature d'une clé doit se faire uniquement après vérification en réel de la personne, avec transfert physique du fingerprint.
On vient donc de signer (contre-signer en fait) la clé publique de notre interlocuteur. On va maintenant dire au reste du monde qu'on a signé la clé de l'autre personne...
On peut soit envoyer à son propriétaire la clé signée : on exporte la clé et on l'envoie :
gpg --export --armor idPersonne
ou on l'envoie directement sur un serveur de clés :
gpg --keyserver pgp.mit.edu --send-key idPersonne
L'usage fait que généralement, on fait les deux.
Lorsqu'on envoie la clé au serveur de clés, ou lorsqu'on réimporte une clé qui a été signée depuis, cette dernière n'est pas écrasée, mais les signatures sont extraites et ajoutées le cas échéant.
Les clés qu'on a récupérées ont donc peut-être été signées par d'autres personnes.
Pour le voir, il suffit de taper la commande :
gpg --list-sigs
On remarque qu'on a sa propre clé auto-signée.
De plus, la clé qu'on a récupéré a été signée par plusieurs personnes que l'on ne connait pas. En effet, on n'a pas leur clé publique dans notre trousseau.
Si on importe par exemple la clé d'UID 0xB4C5FE7F, on aurait la réponse suivante :
$ gpg --list-sigs /home/guyeux/.gnupg/pubring.gpg ------------------------------- pub 1024D/B52FF09E 2009-01-30 uid Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> sig 3 B52FF09E 2009-01-30 Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> sub 4096g/5552598C 2009-01-30 sig B52FF09E 2009-01-30 Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> ------------------------------- pub 1024D/CE63A2E7 2000-02-23 uid Benoit <benoit@parinux.org> sig 5ED61FDA 2000-06-06 [User id not found : sig CE63A2E7 2000-02-23 Benoit <benoit@parinux.org> sig B4C5FE7F 2001-07-18 Olivier Berger <oberger@april.org> sub 2048g/B5A97C83 2000-02-23 sig CE63A2E7 2000-02-23 Benoit <benoit@parinux.org>
On peut donc savoir qui sont les personnes qui ont signé les clés de notre trousseau.
Avec l'option --list-sigs, on sait juste que la clé a été signée par un certain nombre de personnes, sans le vérifier.
On peut demander à GnuPG de vérifier les différentes signatures qu'il possède de chaque clé avec les clés qu'il a dans son trousseau...
$ gpg --check-sigs /home/guyeux/.gnupg/pubring.gpg ------------------------------- pub 1024D/B52FF09E 2009-01-30 uid Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> sig!3 B52FF09E 2009-01-30 Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> sub 4096g/5552598C 2009-01-30 sig! B52FF09E 2009-01-30 Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> ------------------------------- pub 1024D/CE63A2E7 2000-02-23 uid Benoit <benoit@parinux.org> sig? 5ED61FDA 2000-06-06 sig! CE63A2E7 2000-02-23 Benoit <benoit@parinux.org> sig! B4C5FE7F 2001-07-18 Olivier Berger <oberger@april.org> sub 2048g/B5A97C83 2000-02-23 sig! CE63A2E7 2000-02-23 Benoit <benoit@parinux.org>
Il peut donc être intéressant de récupérer fréquemment les nouvelles signatures des clés qui font partie de notre trousseau.
Une manière simple est de passer par un script à glisser dans son crontab, une fois par jour.
Dans un premier temps, ce processus tisse un réseau de confiance autour de soi, avec les personnes que l'on connaît, et avec qui on se fait des échanges de clés...
Puis, on est amené à récupérer un jour la clé d'une personne inconnue, appelons-la Charlie.
On a échangé nos clés tous les deux, et B et C en ont fait de même. Vu qu'on a confiance en B, on peut se dire qu'il a bien fait les choses.
Il a donc bien signé la clé de C en suivant le protocole requis (échange physique des fingerprints, contrôle de l'identité). On peut alors se dire qu'il y a 99% de chances pour que la clé de C soit la bonne.
Mais on n'en sera jamais sûr à 100%. C'est pourquoi, dans un cas pareil, il ne faut jamais signer une clé qu'on a contrôlée par ce moyen.
Imaginons que B ne soit pas quelqu'un que l'on connaît bien. Cela peut être une personne avec qui on a fait un échange de fingerprints la seule fois où on l'a rencontré, mais qu'on ne connaît pas pour autant.
On ne peut pas être sûr que la vérification de la clé de C s'est faite dans de bonnes conditions.
Donc on ne va pas faire autant confiance à la clé publique de C (on va dire, 40% par exemple).
Afin de mettre cette confiance en forme, il est possible d'attribuer plusieurs niveaux de confiance à un utilisateur.
Pour se faire il faut éditer la clé...
$ gpg --edit-key christophe gpg (GnuPG) 1.4.9; Copyright (C) 2008 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. La clé secrète est disponible. pub 1024D/B52FF09E créé: 2009-01-30 expire: jamais utilisation: SC confiance: ultime validité: ultime sub 4096g/5552598C créé: 2009-01-30 expire: jamais utilisation: E [ ultime ] (1). Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> Commande>
Puis exécuter la commande trust :
Commande> trust pub 1024D/B52FF09E créé: 2009-01-30 expire: jamais utilisation: SC confiance: ultime validité: ultime sub 4096g/5552598C créé: 2009-01-30 expire: jamais utilisation: E [ ultime ] (1). Christophe Guyeux (Clé du boulot) <christophe.guyeux@univ-fcomte.fr> Décidez maintenant à quel point vous avez confiance en cet utilisateur pour qu'il vérifie les clés des autres utilisateurs (vous pouvez vérifier son passeport, vérifier les empreintes de plusieurs sources différentes, etc.) 1 = ne sais pas ou ne dirai pas 2 = je ne fais PAS confiance 3 = je crois marginalement 4 = je fais entièrement confiance 5 = je donne une confiance ultime m = retour au menu principal Votre décision ?
Tout ce qu'il reste à faire, c'est indiquer le niveau de confiance pour cet utilisateur...