GnuPG : Créer la paire de clé gpg parfaite : clé maitre, subkeys et support smartcard (yubikey)

De Linux Server Wiki
Sauter à la navigation Sauter à la recherche


1 Note sur gpg

Quand vous listez les clés publiques (gpg -k) ou privés (gpg -K) vous verrez au niveau de la première colonne des raccourcis qui signifient :

sec => 'SECret key'
ssb => 'Secret SuBkey'
pub => 'PUBlic key'
sub => 'public SUBkey'

2 Prérequis

  • Une clé usb, disque usb, ou tout autre média amovible réinscriptible pour stocker de manière sécurisé votre clé gpg maître. Je vous recommande vivement de chiffrer ce media (en utilisant par exemple veracrypt).

3 Initialisation

Montez votre media usb sur votre ordinateur. Dans cet exemple, il sera monté dans /media/veracrypt1. Créez un dossier qui va contenir votre trousseau gpg maître.

mkdir -p /media/veracrypt1/GNUPG_HOME/HOME/

Si vous utilisez le système de fichier FAT sur le media usb sur lequel vous allez stocker votre trousseau maître gpg, il faut créer un fichier S.gpg-agent à la racine de votre futur trousseau gpg afin de forcer la création du socket de l'agent gpg en dehors du système de fichier FAT. Dans cet exemple, je force la création du socket de l'agent gpg dans le répertoire utilisateur de ma machine :

cat >/media/veracrypt1/GNUPG_HOME/HOME/S.gpg-agent <<EOF
%Assuan%
socket=${HOME}/.gnupg/S.gpg-agent-SecureDisk
EOF

4 Générer la clé maître

Nous allons créer une clé maître RSA de 8192 bits. Cette taille de clé n'est pas nativement supportée par gpg mais on peut en forcer la création en passant par le mode batch de gpg. Pour cela, nous créons le fichier newkey contenant les différentes informations de notre future clé maître. Pensez à changer les lignes Name-Real, Name-Email et Passphrase :

cat >newkey <<EOF
     %echo Generating a RSA key
     Key-Type: RSA
     Key-Length: 8192
     Key-Usage: cert,sign
     Name-Real: testuser
     #Name-Comment:
     Name-Email: testuser@domain.tld
     Expire-Date: 0
     Passphrase: tmppassphrasepleaseedit
     # Do a commit here, so that we can later print "done"
     %commit
     %echo done
EOF
  • FIXME: possibilité de se passer du flag sign ?

Générez la clé maître dans le trousseau gpg maître que nous avons créé :

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --batch --gen-key --enable-large-rsa -a newkey

Dans cet exemple, la clé créé a l'identifiant 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951.

Vous pouvez ajouter des uid à votre clé maître en utilisant la commande adduid du prompt gpg. Vous devez pour cela commencer par éditer votre clé maître :

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Puis entrer la commande adduid au prompt gpg. Terminez avec save.

adduid
save

Si vous rencontrez un problème lors de la génération d'un uid, éditez la clé avec l'argument --allow-freeform-uid

5 Ajout des sous-clés (subkeys)

5.1 Clé de signature

Pour commencer, nous allons créer une subkey de signature. Commencez par ouvrir votre clé maître :

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Au prompt gpg, utilisez la commande addkey. Utilisez le type RSA (sign only), la taille 4096 et éventuellement une date d'expiration (dans mon cas, je n'en spécifie aucune (0)). Terminez en sauvegardant la clé (save) :

addkey
(4) RSA (sign only)
4096
0
save

5.2 Clé de chiffrement

Nous allons maintenant créer une subkey de chiffrement. Commencez par ouvrir votre clé maître :

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Au prompt gpg, utilisez la commande addkey. Utilisez le type RSA (encrypt only), la taille 4096 et éventuellement une date d'expiration (dans mon cas, je n'en spécifie aucune (0)). Terminez en sauvegardant la clé (save) :

addkey
(6) RSA (encrypt only)
4096
0
save

5.3 Clé d'authentification

Enfin, créons une subkey d'authentification. Commencez par ouvrir votre clé maître avec l'argument --expert :

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --expert --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Au prompt gpg, utilisez la commande addkey. Utilisez le type RSA (set your own capabilities), désactivez les flags de signature et de chiffrement, activez le flag d'authentification. Pour la taille, 4096 bits et éventuellement une date d'expiration (dans mon cas, je n'en spécifie aucune (0)). Terminez en sauvegardant la clé (save). Au prompt gpg on obtient :

addkey
(8) RSA (set your own capabilities)
(S) Toggle the sign capability                     (on désactive la signature activé par défaut)
(E) Toggle the encrypt capability                  (on désactive l'encrypt activé par défaut)
(A) Toggle the authenticate capability             (on active l'auth)
(Q) Finished
4096
0
save

6 Etat des lieux

A ce stade, vous devriez vous retrouver avec quelque chose comme ça :

$ gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --keyid-format LONG --list-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
pub   rsa8192/99FD9BFE6F9B8951 2017-07-07 [SC]
uid                 [ultimate] testuser <testuser@domain.tld>
sub   rsa4096/0B4D29418F92CF1D 2017-07-07 [S]
sub   rsa4096/91B74A739D6A4242 2017-07-07 [E]
sub   rsa4096/256A58F8E560F1D7 2017-07-07 [A]
$ gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --keyid-format LONG --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
sec   rsa8192/99FD9BFE6F9B8951 2017-07-07 [SC]
uid                 [ultimate] testuser <testuser@domain.tld>
ssb   rsa4096/0B4D29418F92CF1D 2017-07-07 [S]
ssb   rsa4096/91B74A739D6A4242 2017-07-07 [E]
ssb   rsa4096/256A58F8E560F1D7 2017-07-07 [A]

7 Facultatif: signer votre nouvelle clé avec votre ancienne clé (si vous en possédiez une)

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --default-key OLD_KEY_ID --sign-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

8 Générer un certificat de révocation pour la clé maître

Créez un certificat de révocation pour votre clé maître. Utilisez le flag 1 = Key has been compromised comme raison de révocation, et entrez un descriptif supplémentaire spécifiant que ce certificat de révocation a été créé lors de la création de la clé. Terminez par une ligne vide.

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey.gpg-revocation-certificate --gen-revoke 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Decision : 1 = Key has been compromised
> This revocation certificate was generated when the key was created.
>

Ce certificat est capital. Sauvegardez le à plusieurs endroits sécurisés (et hors ligne de préférence). Si vous perdiez l'accès à votre clé maître, ce certificat serait le seul moyen révoquer définitivement votre clé maître.

9 Sauvegarde de la clé maître et ses sous-clés

  • Sauvegarde des clés privés :
gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey.priv.gpg --export-secret-keys --armor 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --export-secret-subkeys --armor 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 > /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only.priv.gpg
  • Sauvegarde des clés publiques :
gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey.pub.gpg --export --armor 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

10 Utilisation de votre clé directement sur votre machine (sans smartcard)

Importez les subkeys dans votre trousseau gpg local :

gpg --import /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only.priv.gpg


A ce stade, vous pouvez éjecter et débrancher votre média usb.

Editez la clé et définissez son niveau de confiance au maximum :

gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
trust
5
save

Vérifiez l'importation :

$ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
sec#  rsa8192 2017-07-07 [SC]
      7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
uid           [ultimate] testuser <testuser@domain.tld>
ssb   rsa4096 2017-07-07 [S]
ssb   rsa4096 2017-07-07 [E]
ssb   rsa4096 2017-07-07 [A]

Notez le dièse (#) a côté du sec qui signifie que la clé privé maître est absente.

11 Utilisation de votre clé avec une smartcard

Branchez votre smartcard puis editez la avec gpg.

gpg --card-edit

Configurez ces différentes options :

admin           (active les commandes admin)
passwd          (changer le pin, admin pin et reset key)
                (le pin sera demandé a chaque opération avec la clé)
name            (définir son nom)
sex             (définir son sexe)
lang            (définir sa langue)
quit

Attention, sauvegardez bien le pin admin (c'est celui qui vous permettra de modifier la clé par la suite) et le pin reset (il sera nécessaire si vous perdiez le pin admin, et permettra de remettre la smartcard a zero).

Créer un backup du dossier contenant votre trousseau maître (car lors du transfert des subkeys vers la smartcard, les privkey sont effacés du trousseau gpg..) :

cd /media/veracrypt1/GNUPG_HOME/
tar -cf HOME.tar HOME/
cd

Ouvrez votre clé maître :

gpg --home /media/veracrypt1/GNUPG_HOME/HOME/ --edit 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Afin de transférer chaque sous-clé sur la smartcard, il faut activer la selection avec la commande toggle puis les sélectionner une à une avec la commande key <NUMÉRO>. La clé sélectionné s'affichera suivi d'une étoile (*). Pour la transférer, on lance la commande keytocard puis on sélectionne le bon slot sur la smartcard. Pour savoir quelle clé doit aller dans quel slot, aidez vous de la ligne usage : S pour Signature, E pour Encryption, A pour Authentification.

11.1 Transfert de la clé de signature

gpg> toggle
gpg> key 1               (sélectionne la clé 1)
sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: SC   
     trust: ultimate      validity: ultimate
ssb* rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
ssb  rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E   
ssb  rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> keytocard
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]

Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1

You need a passphrase to unlock the secret key for
[...]

sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: SC   
     trust: ultimate      validity: ultimate
ssb* rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
                     card-no: 0000 00000000
ssb  rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E   
ssb  rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> key 1               (desélectionne la clé)

11.2 Transfert de la clé de chiffrement

gpg> key 2               (sélectionne la clé 2)
sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: C   
     trust: ultimate      validity: ultimate
ssb  rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
                     card-no: 0000 00000000
ssb* rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E   
ssb  rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> keytocard
Signature key ....: D0FE 6A6E 7329 714A 497F  2066 0B4D 2941 8F92 CF1D
Encryption key....: [none]
Authentication key: [none]

Please select where to store the key:
   (2) Encryption key
Your selection? 2

You need a passphrase to unlock the secret key for
[...]

sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: SC   
     trust: ultimate      validity: ultimate
ssb  rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
                     card-no: 0000 00000000
ssb* rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E   
                     card-no: 0000 00000000
ssb  rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> key 2               (desélectionne la clé)

11.3 Transfert de la clé d'authentification

gpg> key 3               (sélectionne la clé 3)

sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: C   
     trust: ultimate      validity: ultimate
ssb  rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
                     card-no: 0000 00000000
ssb  rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E
                     card-no: 0000 00000000   
ssb* rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> keytocard
Signature key ....: D0FE 6A6E 7329 714A 497F  2066 0B4D 2941 8F92 CF1D
Encryption key....: 2CD3 F966 6571 BBE3 AF80  E3DE 91B7 4A73 9D6A 4242
Authentication key: [none]

Please select where to store the key:
   (3) Authentication key
Your selection? 3

You need a passphrase to unlock the secret key for
[...]

sec  rsa8192/99FD9BFE6F9B8951
     created: 2017-07-07  expires: never       usage: C   
     trust: ultimate      validity: ultimate
ssb  rsa4096/0B4D29418F92CF1D
     created: 2017-07-07  expires: never       usage: S   
                     card-no: 0000 00000000
ssb  rsa4096/91B74A739D6A4242
     created: 2017-07-07  expires: never       usage: E
                     card-no: 0000 00000000   
ssb* rsa4096/256A58F8E560F1D7
     created: 2017-07-07  expires: never       usage: A   
                     card-no: 0000 00000000   
[ultimate] (1). testuser <testuser@domain.tld>

gpg> key 3               (desélectionne la clé)
gpg> save

11.4 Vérification après transfert

La commande suivante :

gpg --home /media/veracrypt1/GNUPG_HOME/HOME/ --list-secret-keys

Devrait retourner :

sec   rsa8192 2017-07-07 [SC]
      7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
uid           [ultimate] testuser <testuser@domain.tld>
ssb>  rsa4096 2017-07-07 [S]
ssb>  rsa4096 2017-07-07 [E]
ssb>  rsa4096 2017-07-07 [A]

Notez le symbole > a côté des ssb qui signifie que la clé privé est stocké sur une smartcard.

11.5 Restauration de votre trousseau maître

Cela permet de conserver un trousseau complet contenant la clé maître et ses sous-clés et ce malgré l'usage d'une smartcard.

cd /media/veracrypt1/GNUPG_HOME/
shred HOME/*
shred HOME/*/*
rm -rf HOME
tar -xf HOME.tar
cd

11.6 Export et importation des clés publiques sur votre trousseau local

Exportez votre clé publique depuis votre trousseau maître :

gpg --home /media/veracrypt1/GNUPG_HOME/HOME/ --armor --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 > ~/gpg_pubkey.gpg


A ce stade, vous pouvez éjecter et débrancher votre média usb.

Puis importez la dans le trousseau par défaut de gpg

gpg --import < ~/gpg_pubkey.gpg

Accordez une confiance totale à votre clé :

gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
trust
5
save

Puis vérifiez votre installation finale :

gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

Devrait retourner :

sec#  rsa8192 2017-07-07 [SC]
      7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
uid           [ultimate] testuser <testuser@domain.tld>
ssb>  rsa4096 2017-07-07 [S]
ssb>  rsa4096 2017-07-07 [E]
ssb>  rsa4096 2017-07-07 [A]

Notez encore une foi le symbole dièse (#) qui signifie que la clé privée maître n'est pas disponible dans ce trousseau, et le symbole > qui signifie que les sous-clés privés sont stockés sur une smartcard.

12 En pratique

Pour les opérations de signature/vérification, chiffrement/déchiffrement et d'authentification, seul votre trousseau local (et votre smartcard si vous avez décidé d'en utiliser une) sont nécessaires.

Les opérations suivantes nécessitent d'être réalisées avec votre trousseau maître (celui stocké sur le média usb) (gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/) :

  • Ajouter une identité/uid (par exemple si vous changez d'adresse mail) à votre clé
  • Signer la clé de quelqu'un d'autre : gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --sign-key 0xKEY_TO_SIGN puis exporter la signature et la renvoyer à votre ami.
  • Révoquer une sous-clé
  • Créer une nouvelle sous-clé

Notez que pour chacune des opérations précédentes, après l'avoir réalisé, il faudra re-publier votre clé maître publique sur les serveurs de clé (afin que le monde entier soit mis au courant de votre nouvel uid/clé/signature) : gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --send-keys --keyserver <serveur de clé> 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951

12.1 Exemple pour révoquer une sous-clé

gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
key 1               (selectionne la subkey numéro 1)
revkey
save

Une fois la révocation effectuée, vous devrez à nouveau publier votre clé maître publique sur les serveurs de clé (afin que le monde sache que vous avez révoqué une sous-clé)