GnuPG

De La Mouche VII
Aller à la navigationAller à la recherche


GnuPG (GNU Privacy Guard) est une implémentation libre du standard de chiffrement OpenPGP, qui fonctionne sur un système de clefs asymétriques.

Pour envoyer un message chiffré (quel que soit le protocole utilisé) à une personne, il vous faut à tous les deux un couple de clefs, composé d'une clef privée (que, comme son nom l'indique, chacun garde pour lui) et une clef publique (qui, comme son nom l'indique, est mise à disposition de tout un chacun). Le message que vous allez envoyer sera chiffré avec votre clef privée et la clef publique du destinataire. Pour le décrpyter, ce dernier utilisera sa clef privée et votre clef publique.

Configuration : utiliser SHA-2

L'ancien algorithme SHA-1, utilisé par défaut par GnuPG (pour des raisons de protocoles), donne des signes de faiblesses. La migration vers la famille SHA-2 est entamée. Pour générer une clef robuste, ajoutez les lignes suivantes au fichier ~/.gnupg/gpg.conf (créez-le s'il n'existe pas encore) :

personal-digest-preferences SHA256
cert-digest-algo SHA256
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed

La dernière ligne indique que toute nouvelle clef sera créée avec l'algorithme SHA512 si possible.

L'inconvénient d'utiliser une clef en SHA-2 est que les (très) anciennes implémentations ne le supportent pas forcément. Cependant, ça fait un bon moment que GnuPG l'intègre, on peut donc franchir le pas sans trop de risque.

Générer un couple de clefs

Il me semble que le programme GnuPG est installé par défaut dans la plupart des distributions. Sous Debian le paquet s'appelle tout simplement gnupg.

aptitude install gnupg

En premier lieu, il faut donc générer un couple de clefs :

$ gpg --gen-key

Les choix par défaut conviennent très bien (validez simplement chaque étape par <Entrée>). Si vous êtes à un degré de paranoïa plus élevé que la moyenne, vous pouvez éventuellement augmenter la longueur de la clef ELG-E (deuxième question), ce qui sera plus sécurisé mais augmentera légèrement les temps de chiffrement/déchiffrement. Vous pouvez aussi fixer une durée de validité de la clef (troisième question), mais cela est inutile si vous générez et mettez en sûreté un certificat de révocation, que vous utiliserez si la clef venait à être corrompue. Dites ensuite que c'est correct en tapant 'o', puis renseignez les champs :

  • Nom réel : mettez votre nom ou pseudonyme.
  • Adresse e-mail : mettez l'adresse pour laquelle vous désirez chiffrer les messages. Si vous ne destinez pas cette clef à du chiffrement de courriels (et même si c'est le cas), une adresse bidon ou un JID (Jabber ID, pour les incultes) doit fonctionner.
  • Commentaire : mettez ce que vous voulez, comme une phrase caractéristique qui permettra de reconnaître votre clef. Exemple : « Oui, c'est bien moi. » si votre pseudo est du genre « Dark Lord » ou « Sangoku », permettra de trouver facilement votre clef parmis les 4569 « Dark Lord » ou « Sangoku » référencés sur le serveur de clefs. Mais je m'égare...

Validez ensuite en tapant 'o'.

On vous demande alors d'« entrer la phrase de passe ». Pas de panique, ne vous cassez pas la tête pour trouver une phrase, c'est simplement d'un mot de passe qu'il s'agit. Et vous aurez à le taper par la suite, donc s'il fait un peu moins de 50 caractères c'est mieux. D'ailleurs on vous demande de la taper une deuxième fois immédiatement.

Voici à présent une étape fort sympathique qui va vous permettre de vous muscler les bras. Voici le message qui apparaît :

Un grand nombre d'octets aléatoires doit être généré. Vous devriez faire
autre-chose (taper au clavier, déplacer la souris, utiliser les disques)
pendant la génération de nombres premiers; cela donne au générateur de
nombres aléatoires une meilleure chance d'avoir assez d'entropie.

Obéissez donc, bougez la souris dans tous les sens, lancez des programmes, tapez comme une brute sur votre clavier, etc. Plus vous y mettrez du votre et plus la génération de la clef sera rapide (il est prouvé que le degré de pression appliqué sur les touches du clavier est un facteur direct de la vitesse d'exécution de ce processus). ls -R / fonctionne assez bien aussi.

Un message apparaît, ressemblant à :

gpg: clé XXXXXXXX marquée comme ayant une confiance ultime.
les clés publique et secrète ont été créées et signées.

XXXXXXXX est une chaîne de huit caractères (chiffres et lettres). Il s'agit des huit derniers caractères de l'empreinte (ou fingerprint dans la langue de Cheik Spir) de la clef publique, qui forment son identifiant. Notez cet identifiant, nous en aurons besoin dans l'étape suivante. C'est en outre lui qui vous permettra d'effectuer toutes les actions possibles sur la clef.

Pour retrouver l'identifiant d'une clef, exécutez :

$ gpg --list-keys

ou, pour afficher également les empreintes des clefs :

$ gpg --fingerprint

Localisez la clef qui vous intéresse dans la liste. Au début de la première ligne lui correspondant (celle qui commence par "pub"), on a la longueur et le type de la clef (normalement 1024D), suivi d'une barre oblique puis de l'identifiant de la clef, ce qui donne quelque chose du genre :

pub   1024D/XXXXXXXX 2006-02-15 [expire: 2006-02-16]

Mettre à disposition sa clef publique

Il faut à présent que nos contacts puissent obtenir facilement notre clef publique. Vous pouvez tout simplement placer le fichier généré sur votre site, ou même l'envoyer aux personnes vous le demandant, mais la meilleure solution consiste à l'envoyer sur un serveur de clefs.

Exporter la clef

Si l'on veut simplement envoyer la clef au cas par cas, ou la mettre sur un site quelconque, il faut l'exporter dans un fichier :

$ gpg --export -a -o ma_clef.asc id_clef

ma_clef.asc est le fichier où sera enregistrée votre clef publique, et id_clef l'identifiant de ladite clef publique.

Utiliser un serveur de clefs

Deux solutions s'offrent à nous pour mettre une clef sur un serveur de clefs.

Méthode HTTP

Une solution simple est de passer par l'interface web du serveur de clés, si elle existe. Par exemple depuis la page d'accueil de subkeys.pgp.net ou keyserver.net, cliquez sur "envoyer votre clef"i ("submit your key"), puis entrez simplement le chemin du fichier ma_clef.asc que vous venez de générer (ou copiez-collez son contenu, selon les serveurs) et envoyez (bouton "submit").

C'est facile, mais c'est tellement simple que ça vallait à peine le coup d'en parler !

Méthode gpg pur

Voyons maintenant la méthode "autonome", utilisant à 100% notre chère commande gpg.

Votre fichier ~/.gnupg/gpg.conf contient (à la ligne 112 chez moi, mais bon...) une liste de serveurs. Ce sont des lignes de la forme :

keyserver hkp://subkeys.pgp.net

Au départ il ne contient même que cette ligne-là. Libre à vous d'en ajouter. A noter que c'est le dernier serveur déclaré qui est utilisé par défaut.

La commande qui va envoyer votre clef sur le serveur est, si vous voulez utiliser le serveur par défaut de votre gpg.conf :

gpg --send-key id_clef

ou si vous voulez spécifier un serveur :

gpg --send-key --keyserver serveur id_clef

serveur est l'adresse du serveur, de la forme protocole://nom_DNS (comme dans gpg.conf).

Importer et signer une clef

Maintenant que nous disposons d'un couple de clefs, et que nous avons mis à disposition notre clef publique, on va récupérer les clefs publiques des gens à qui l'on souhaite pouvoir envoyer des messages chiffrés (ou simplement signés).

Importer la clef

La première chose à faire est de télécharger et d'importer la clef.

Méthode "fichier"

On peut vous envoyer, ou vous inviter à télécharger un fichier contenant la clef publique à importer.

Une fois que l'on dispose de ce fichier, on place la clef publique dans notre trousseau par la commande :

$ gpg --import id_clef.asc

id_clef.asc est le fichier en question.

Méthode gpg pur

On peut aussi simplement vous indiquer un serveur de clefs (on trouve souvent ce type de messages dans les signatures : « Ma clef publique se trouve sur http://keyserver.net »). Il y a deux cas : soit on vous donne l'identifiant de la clef (ou l'empreinte complète), soit vous disposez seulement de l'adresse ou du nom associés.

Dans le premier cas, tapez :

gpg --recv-key id_clef

si le serveur où la clef se trouve figure dans votre ~/.gnupg/gpg.conf, ou, si elle ne s'y trouve pas :

gpg --keyserver serveur --recv-key id_clef

Dans le second cas (vous ne disposez pas de l'identifiant de la clef), il va nous falloir chercher ce dernier :

gpg --search-key nom

nom est un morceau du nom, du commentaire, ou de l'adresse (s'il contient des espaces, mettez le tout entre guillemets).

Comme d'habitude, si le serveur de clefs à utiliser ne figure pas dans votre fichier de configuration, utilisez plutôt :

gpg --keyserver serveur --search-key nom

Si la recherche fournit des résultats, une liste de clefs correspondant au critère de recherche apparaît, terminée par une ligne de la forme :

Keys 1-11 of 219 for "nom".  Entrez le(s) nombre(s), S)uivant, ou Q)uitter >

Si vous ne voyez pas la clef qui vous intéresse, entrez 's' pour afficher la page suivante. Lorsque vous la voyez, entrez son numéro (le nombre tout à gauche dans la liste), et validez. La clef est automatiquement téléchargée et importée.

Bien sûr vous pouvez aussi passer par l'interface web du serveur de clefs pour effectuer la recherche et télécharger un fichier contenant la clef, mais c'est moins amusant (cela revient à la première méthode).

Signer la clef

Si l'on a confiance dans l'origine de la clef et que l'on est certain de l'identité de son possesseur (typiquement, on l'a rencontré en personne et comparé les empreintes des clefs à cette occasion), on peut signer la clef avec sa propre clef privée :

$ gpg --sign-key id_clef

Vous aurez à confirmer, puis à entrer la phrase de passe de votre clef privée.

Il faut ensuite renvoyer la clef sur le serveur par la commande vue précédemment :

gpg --send-key id_clef

Cela veut dire que vous apportez votre garantie sur l'authenticité de la clef et l'identité de son possesseur.

Révoquer une clef

Si vous cessez d'utiliser une clef, par exemple parce qu'elle a été compromise (quelqu'un a forcé votre clef privée par exemple), il est préférable de créer un certificat de révocation.

$ gpg --gen-revoke id_clef > revoke_id_clef

Confirmez par 'o' que vous voulez bel et bien générer un certificat de révocation, puis donnez un motif pour la révocation. Vous avez ensuite le choix de renseigner une "description optionnelle", qui vous permet d'expliquer en long en large et en travers, avec force détails, les raisons qui vous ont poussé à commettre cet acte (de révocation). Comme on vous le demande, revenez à la ligne depuis une ligne vide pour terminer la description, dites que c'est d'accord, et enfin entrez la phrase de passe de la clef.

Nous voilà en possession d'un beau fichier revoke_id_clef contenant le certificat de révocation de notre clef. GnuPG vous invite à prendre moult précautions à son sujet.

Importez maintenant ce certificat par la commande :

$ gpg --import revoke_id_clef

afin de marquer la clef comme révoquée dans votre trousseau.

Si vous n'avez pas utilisé de serveur de clefs, vous pouvez mettre ce fichier à disposition comme bon vous semble, vos contacts devront eux aussi l'importer pour marquer la clef comme révoquée chez eux.

Dans le cas contraire, après avoir importé le certificat de révocation chez vous, renvoyez la clef sur le serveur comme expliqué plus haut (gpg --send-key). Vos contacts devront quant à eux réimporter la clef pour mettre à jour leur trousseau.

Supprimer une clef

Il est parfois utile de pouvoir supprimer une clef de votre trousseau, soit la clef publique de quelqu'un avec qui vous avez cessé de communiquer, soit une clef expirée ou révoquée, ou encore une paire de clefs vous appartenant mais que vous n'utilisez plus (dans ce dernier cas pensez avant tout à générer un certificat de révocation comme vu précédemment).

Pour supprimer une clef publique, tapez :

$ gpg --delete-key id_clef

Pour supprimer une clef privée, tapez :

$ gpg --delete-secret-key id_clef

Pour supprimer un couple de clefs (publique et privée), tapez :

$ gpg --delete-secret-and-public-key id_clef

Modifier une clef

On a parfois besoin de modifier les paramètres d'un couple de clefs, par exemple le mot de passe. Pour entrer dans le mode interactif d'édition de la clef, tapez :

$ gpg --edit-key id_clef

Après quelques informations relatives au programme, ainsi qu'à la clef, vous obtenez une invite :

Commande>

Tapez "help" ou '?' pour voir la liste des commandes disponibles. Par exemple pour changer la phrase de passe de la clef, la commande est passwd :

Commande> passwd

On vous demande l'ancienne phrase, puis deux fois la nouvelle.

Pour quitter le mode d'édition, tapez 'q', "quit", ou encore appuyez sur <Ctrl>+D. Si des modifications ont été effectuées, on vous demande si vous voulez les enregistrer. Répondez 'o' et voilà.

Commande> q
Enregistrer les changements? (o/N) o

Alternativement, la commande save permet de sauvegarder et quitter sans confirmation.

À noter qu'il est possible de lancer directement une commande dès l'appel du programme. Par exemple :

$ gpg --edit-key id_clef passwd

lance directement l'invite de changement de la phrase de passe.

Par contre, le programme reste dans le mode d'édition et il faut quitter comme précédemment.

Une fois les changements effectués, n'oubliez pas de renvoyer votre clef à vos correspondants ou à un serveur de clefs avec gpg --send-key (ce qui est tout de même plus simple).

Gestion des adresses (UID)

Pour chaque adresse de courriel supplémentaire que vous comptez utiliser avec cette clef, il faut ajouter un UID, avec l'adresse en question, le nom et éventuellement un commentaire associé.

La commande est adduid. GPG vous demandera donc, comme lors de la création de la clef, d'entrer le nom réel, l'adresse et le commentaire. Vous aurez besoin de la phrase de passe pour terminer l'ajout.

Une fois tous les utilisateurs ajoutés, vous pouvez les lister grâce à la commande uid, les sélectionner avec uid numéro (numéro étant le numéro de l'utilisateur dans la liste), et leur attribuer un niveau de confiance avec trust (le même niveau de confiance sera attribué à tous les utilisateurs sélectionnés).

À noter que les changements sur les niveaux de confiance n'apparaissent pas immédiatement, vous devrez d'abord sauvegarder et relancer l'interface.

Pour supprimer un UID, sélectionnez-le avec uid numéro, puis tapez deluid.

Conclusion

J'ai présenté ici les commandes les plus utiles pour une utilisation de base. Comme d'habitude, man est votre ami :

$ man gnupg
$ man gpg

Quelques petites remarques quand même :

  • Les options de la forme --*-key peuvent généralement s'écrire --*-keys. Autrement dit le pluriel n'a souvent pas d'importance pour gpg.
  • Pour éviter toute ambiguïté, il est possible d'utiliser d'autres méthode pour faire référence à une clef. En effet, il est possible que les huits derniers caractères des empreintes de deux clefs soient identiques. Partout où j'ai écrit "id_clef", on peut donc utiliser l'empreinte complète de la clef (sans espaces). Il y a d'autres possibilités : pour plus d'informations voyez la page de manuel de gpg, sous le titre « How to specify a user ID » (vers la fin).
  • Il existe des interfaces graphiques à GnuPG, comme Seahorse pour Gnome ou Kgpg pour KDE. L'extension Enigmail de Thunderbird peut également permettre de gérer son trousseau.

Nous sommes maintenant fin prêts pour chiffrer ses courriels ou des conversations jabber.