Skip to content

GPG et votre secret sera bien gardé (Partie 2)

Dans l’article précédent, nous avons généré notre paire de clés privée/publique. A présent, nous allons voir comment les utiliser.

Utilisation de GPG

Commençons par importer des clefs publiques dans le but de chiffrer des éléments pour un destinataire donné. Pour cela, nous allons utiliser l’argument --import (bien évidemment, il faut au préalable que votre collaborateur vous ait envoyé sa clef) :

$ gpg --import <clef publique à importer>

Par exemple, je souhaite partager des fichiers de manière sécurisée avec Thomas Pesquet (oui, je sais, j’ai pas mal de relations 😂). On l’a vu précédemment, la première étape consiste à importer la clef publique de Thomas sur notre système :

$ gpg --import thomaspesquet.pem

gpg: key 930A125042E640EE: public key "Thomas Pesquet <thomas.pesquet@hotmail.fr>" imported
gpg: Total number processed: 1
gpg:               imported: 1

On peut également vérifier que la clef à bien été importée avec la commande gpg -k qui permet de lister toutes les clefs publiques présentes sur notre système :

$ gpg -k
/root/.gnupg/pubring.kbx
------------------------
pub   rsa4096 2022-07-03 [SC] [expires: 2024-07-02]
      CFD6DA6900A81BF044DFF18C8CE5FBBD2E9BD4EC
uid           [ultimate] Antoine Mayer (Clef demo article de blog) <demo@antoinemayer.fr>
sub   rsa4096 2022-07-03 [E] [expires: 2024-07-02]

pub   rsa4096 2022-07-12 [SC] [expires: 2024-07-11]
      145E252C47E4449BC070C4C5930A125042E640EE
uid           [ unknown] Thomas Pesquet <thomas.pesquet@hotmail.fr>
sub   rsa4096 2022-07-12 [E] [expires: 2024-07-11]

On voit bien que l’on a nos deux clefs, celle de Thomas et la nôtre  ! 😎

La clé publique de Monsieur Pesquet étant importée, nous allons pouvoir chiffrer nos fichiers avec cette dernière. Utilisons l’argument --encrypt. Je reviendrai sur les autres composants de la commande juste après.

$ gpg --encrypt --output <fichier chiffré> --recipient <e-mail du destinataire> <fichier à chiffrer>

Imaginons que je souhaite envoyer un fichier ultra top secret à Thomas Pesquet. Comme je ne veux pas que n’importe qui puisse être en mesure de lire son contenu, je vais le chiffrer. Seul Thomas sera capable de le déchiffrer. Voici son contenu actuellement :

Bonjour Thomas,

Voici la liste des travaux à effectuer dans l'ISS pour le projet Rénovation :

- tâche rénovation 1
- tâche rénovation 2
- tâche rénovation 3
- tâche rénovation 4

Maintenant, chiffrons le avec la commande suivante :

$ gpg --encrypt --output top_secret.txt.gpg --recipient thomas.pesquet@hotmail.fr iss_travaux_renovations.txt

gpg: 78D8688419FF102A: There is no assurance this key belongs to the named user

sub  rsa4096/78D8688419FF102A 2022-07-12 Thomas Pesquet <thomas.pesquet@hotmail.fr>
 Primary key fingerprint: 145E 252C 47E4 449B C070  C4C5 930A 1250 42E6 40EE
      Subkey fingerprint: 83EF 2663 7039 5CE5 765A  9027 78D8 6884 19FF 102A

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

J’utilise --encrypt pour chiffrer le contenu de mon fichier.

J’indique le nom que devra porter mon fichier chiffré avec l’argument --output (ici top_secret.txt.gpg).

Ensuite, je renseigne mon destinataire à l’aide de --recipient en utilisant l’adresse mail rattachée à la clef publique de Thomas. 

Vous pouvez également vous ajouter en tant que destinataire si vous souhaitez être en mesure de déchiffrer le message.

Et enfin, je renseigne le nom du fichier que je souhaite chiffrer, iss_travaux_renovations.txt.

On voit bien que GPG utilise la clef publique de Thomas pour procéder au chiffrement. ça tombe bien, c’est ce que l’on veut. 😉
On peut regarder le contenu du fichier top_secret.txt.gpg (je vous préviens, ce n’est pas beau à voir 😅)

xh*Rv'~Cu%]6ڟQ54KLƍUTzJUh*b^PUyvW4Q?UO`m=P:/@7a[޺ :}2.6^!#@i)ڪ
                                                              [
/(      P&cChQ:Qe7o1\5|                                        yŠ*YhShh)w/ |PZv.V 00
KS3Vָ<2cO1R"Ǩxf/"򗽄mgE
                     1^Ed0~SZwb@aԟySyLL0
                                        ǸD

In;[
;       ?l>Ҽ    :#Zj0X
                      ]l>sxN9duI[*Z2缊y^Ճ&f(Orzxk
S'YDC1*YNDӥH33QBJmb<f/.'
                        e:h٠F`|.*<q@-t|&"nJq

La, c’est clair, le fichier n’est pas lisible !

Maintenant, plaçons-nous du côté de Thomas. Nous lui avons envoyé le fichier chiffré. 

Voyons comment Monsieur Pesquet peut faire pour prendre connaissance des travaux de rénovation de l’ISS.
Thomas doit utiliser l’argument --decrypt puis renseigner le fichier à déchiffrer :

$ gpg --decrypt <fichier chiffré> > <le fichier déchiffré>

Voici la commande qu’il va devoir faire :

$ gpg --decrypt iss_travaux_renovations.txt.gpg > iss_travaux_renovations.txt

Il lui sera demandé d’entrer sa passphrase (celle de sa clef privée). Une fois cela fait, Thomas devrait voir apparaître un document nommé iss_travaux_renovations.txt.

$ ls -la | grep iss
-rw-r--r-- 1 thomas thomas  181 Jul 13 17:12 iss_travaux_renovations.txt
-rw-r--r-- 1 thomas thomas  719 Jul 13 17:06 iss_travaux_renovations.txt.gpg

Le contenu est bel et bien, lisible par Thomas :

$ cat iss_travaux_renovations.txt
Bonjour Thomas,

Voici la liste des travaux à effectuer dans l'iss pour le projet Rénovation :

- tâche rénovation 1
- tâche rénovation 2
- tâche rénovation 3
- tâche rénovation 4

Vous avez à présent, toutes les étapes requises pour envoyer, chiffrer et déchiffrer des fichiers avec Thomas Pesquet. 😜

Une signature juste ici s’il vous plaît

Afin de garantir avec certitude que vous êtes le propriétaire d’un fichier chiffré, vous pouvez le signer avec votre clef privée. Il suffit de reprendre notre commande précédente et de rajouter l’option --sign comme ceci :

$ gpg --sign --encrypt --output top_secret.txt.gpg --recipient thomas.pesquet@hotmail.fr iss_travaux_renovations.txt

Lors du chiffrement, la passphrase de votre clef privée vous sera demandée.

Lorsque Thomas va déchiffrer notre fichier, il verra que l’on a bien signé ce dernier :

$ gpg --decrypt top_secret.txt.gpg > top_secret.txt

gpg: encrypted with 4096-bit RSA key, ID 530248D548103FA6, created 2022-07-13
      "Thomas Pesquet <thomas.pesquet@hotmail.fr>"
gpg: Signature made Wed Jul 13 17:17:09 2022 UTC
gpg:                using RSA key CFD6DA6900A81BF044DFF18C8CE5FBBD2E9BD4EC
gpg: Good signature from "Antoine Mayer (Clef demo article de blog) <demo@antoinemayer.fr>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: CFD6 DA69 00A8 1BF0 44DF  F18C 8CE5 FBBD 2E9B D4EC

Ne faites pas attention au WARNING, c’est tout simplement parce que Thomas n’a pas “trust” ma clef publique ☹️

Je ne vais pas rentrer dans le détail, l’article est déjà bien assez complet. Si ça vous intéresse voici de la documentation sur le sujet.

Exporter ses clefs

Dans cette dernière partie, nous allons voir comment exporter ses clefs :

  • Comment exporter sa clef publique afin de la partager avec d’autres personnes ?
  • Comment exporter sa clef privée pour la stocker dans un endroit sécurisé ?

Tant de questions ! 😱😱

Commençons par exporter notre clef publique avec l’argument --export. La spécification de l’option armor signifie que nous voulons un format de sortie ASCII sinon, ce sera un binaire.

$ gpg --export -armor <id de votre clef> > <fichier de sortie>

Si l’on reprend mon article précédent, je souhaite à mon tour partager ma clef publique avec Thomas Pesquet. Voici la commande que je vais devoir faire :

$ gpg --export -armor CFD6DA6900A81BF044DFF18C8CE5FBBD2E9BD4EC > antoinegpg.pubkey

Et voilà ! J’ai mon fichier antoinegpg.pubkey que je peux envoyer à Thomas.

Passons à la clef privée. Il faut être super mega over vigilent lorsque l’on exporte sa clef privée et surtout où est-ce que l’on va la stocker. Quiconque sera en possession de celle-ci pourra se faire passer pour vous. Autant vous dire que le certificat de révocation sera votre meilleur ami (cf la partie 1).

Maintenant, que vous êtes conscient des risques de compromission, voici la commande d’export :

gpg --export-secret-subkeys -armor <id de votre clef> > <fichier de sortie>

Il ne reste plus qu’à la stocker en lieu sûr. 🙂


Ah, one more thing. Si vous importez votre clef privée sur une autre machine, il va falloir la trust afin qu’elle soit votre ultimate key. Il faut ensuite l’éditer, je vous montre tout ça :

gpg --edit-key <id de votre clef privée fraîchement importé>

Une console GPG va s’afficher (reconnaissable avec gpg>).
Il faut entrer le mot trust , comme ceci :

gpg> trust
sec  rsa4096/8CE5FBBD2E9BD4EC
     created: 2022-07-03  expires: 2024-07-02  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/521587963006FC1B
     created: 2022-07-03  expires: 2024-07-02  usage: E   
[ultimate] (1). Antoine Mayer (Clef demo article de blog) <demo@antoinemayer.fr>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5

Faites le choix numéro 5 pour la truster complètement. Puis vous pouvez taper quit pour revenir sur votre shell d’origine.

Conclusion

Pour finir, ces 2 articles nous ont permis de nous familiariser avec l’outil. 

Personnellement, je trouve que c’est très utile de savoir jouer avec GPG. Je n’ai pas de vision globale sur son utilisation en entreprise, mais je trouve que c’est des compétences utiles à avoir. Que ce soit pour respecter les pratiques de sécurité de votre entreprise ou encore mieux, les implémenter.

J’espère que vous aurez appris autant de choses que moi sur GPG ! Une chose est sûr, je ne pars plus en courant lorsque j’entends parler de GPG ahaha. 😂

Si vous avez des questions, des remarques ou des améliorations à apporter, je suis disponible sur Twitter.

Published inNon classé