« GnuPG : Créer la paire de clé gpg parfaite : clé maitre, subkeys et support smartcard (yubikey) » : différence entre les versions
(89 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Category:Desktop]] | |||
[[category:security]] | |||
=Note sur gpg= | |||
Quand vous listez les clés publiques (<code>gpg -k</code>) ou privés (<code>gpg -K</code>) vous verrez au niveau de la première colonne des raccourcis qui signifient : | |||
<pre> | |||
sec => 'SECret key' | |||
ssb => 'Secret SuBkey' | |||
pub => 'PUBlic key' | |||
sub => 'public SUBkey' | |||
</pre> | |||
=Prérequis= | =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 [https://www.veracrypt.fr/en/Home.html veracrypt]). | * 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 [https://www.veracrypt.fr/en/Home.html veracrypt]). | ||
Ligne 5 : | Ligne 17 : | ||
Montez votre media usb sur votre ordinateur. Dans cet exemple, il sera monté dans <code>/media/veracrypt1</code>. | Montez votre media usb sur votre ordinateur. Dans cet exemple, il sera monté dans <code>/media/veracrypt1</code>. | ||
Créez un dossier qui va contenir votre trousseau gpg maître. | Créez un dossier qui va contenir votre trousseau gpg maître. | ||
<pre>mkdir -p /media/veracrypt1/GNUPG_HOME/HOME/</pre> | <pre> | ||
mkdir -p /media/veracrypt1/GNUPG_HOME/HOME/ | |||
gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ -k | |||
</pre> | |||
Assurez-vous de ne pas avoir d'ancien agent gpg lancé : | |||
<pre> | |||
gpgconf --kill gpg-agent | |||
unset GPG_AGENT_INFO | |||
</pre> | |||
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 <code>S.gpg-agent</code> à 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 : | 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 <code>S.gpg-agent</code> à 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 : | ||
Ligne 11 : | Ligne 32 : | ||
cat >/media/veracrypt1/GNUPG_HOME/HOME/S.gpg-agent <<EOF | cat >/media/veracrypt1/GNUPG_HOME/HOME/S.gpg-agent <<EOF | ||
%Assuan% | %Assuan% | ||
socket=${ | socket=/run/user/${UID}/gnupg/S.SecureDisk-gpg-agent | ||
EOF | EOF | ||
</pre> | </pre> | ||
==Créer une configuration sécurisée== | |||
Ajoutez ou modifiez les options suivantes dans <code>/media/veracrypt1/GNUPG_HOME/HOME/gpg.conf</code> : | |||
<pre> | |||
personal-cipher-preferences AES256 AES192 AES | |||
personal-digest-preferences SHA512 SHA384 SHA256 | |||
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed | |||
default-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed | |||
cert-digest-algo SHA512 | |||
s2k-digest-algo SHA512 | |||
s2k-cipher-algo AES256 | |||
charset utf-8 | |||
keyid-format 0xlong | |||
with-fingerprint | |||
no-symkey-cache | |||
</pre> | |||
==Forcer le travail sur notre trousseau gpg maitre== | |||
Pour cela il y a deux manières de faire : soit spécifier, a chaque commande gpg l'argument <code>--homedir /media/veracrypt1/GNUPG_HOME/HOME/</code> soit définir la variable d'environnement GNUPGHOME : | |||
<pre> | |||
export GNUPGHOME=/media/veracrypt1/GNUPG_HOME/HOME/ | |||
</pre> | |||
Pour la suite, nous considérerons que vous avez défini la variable GNUPGHOME | |||
Dans le doute, vérifiez bien que gpg-agent n'est pas lancé: | |||
<pre>gpgconf --kill gpg-agent</pre> | |||
=Générer la clé maître= | =Générer la clé maître= | ||
Généralement, la commande permettant de créer une clé la plus malléable possible est : | |||
<pre>gpg --expert --full-generate-key</pre> | |||
Ici 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 [https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html batch] de gpg. Pour cela, nous créez le fichier <code>newkey</code> contenant les différentes informations de notre future clé maître. Pensez à changer les lignes <code>Name-Real</code>, <code>Name-Email</code> et <code>Passphrase</code> : | |||
<pre> | <pre> | ||
cat >newkey <<EOF | cat >newkey <<EOF | ||
Ligne 23 : | Ligne 75 : | ||
Key-Type: RSA | Key-Type: RSA | ||
Key-Length: 8192 | Key-Length: 8192 | ||
Key-Usage: cert | Key-Usage: cert | ||
Name-Real: testuser | Name-Real: testuser | ||
#Name-Comment: | #Name-Comment: | ||
Name-Email: testuser@domain.tld | Name-Email: testuser@domain.tld | ||
Expire-Date: | Expire-Date: 10y | ||
Passphrase: tmppassphrasepleaseedit | Passphrase: tmppassphrasepleaseedit | ||
# Do a commit here, so that we can later print "done" | # Do a commit here, so that we can later print "done" | ||
Ligne 35 : | Ligne 87 : | ||
</pre> | </pre> | ||
Notez qu'ici, notre clé maitre est configurée de manière à ne pouvoir réaliser que des opérations de certification d'autres clés (flag <code>C</code> ou <code>cert</code>).<br> | |||
Notre clé maître est définie avec une expiration de 10 ans. Je vous conseil de toujours définir une date d'expiration à vos clés afin qu'elles expirent d'elles-mêmes si jamais vous la perdiez. Notez que la date d'expiration d'une clé gpg est modifiable a souhait, y compris après expiration, du moment que vous n'avez pas perdu la clé maître. | |||
Générez la clé maître dans le trousseau gpg maître que nous avons créé : | Générez la clé maître dans le trousseau gpg maître que nous avons créé : | ||
<pre>gpg | <pre>gpg --batch --gen-key --enable-large-rsa -a newkey</pre> | ||
Dans cet exemple, la clé | Dans cet exemple, la clé créée a l'identifiant <code>7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</code>. | ||
==Ajout et modification des UIDs de la clé maître== | |||
Vous pouvez ajouter des <code>uid</code> à votre clé maître en utilisant la commande <code>adduid</code> du prompt gpg. Vous devez pour cela commencer par éditer votre clé maître : | Vous pouvez ajouter des <code>uid</code> à votre clé maître en utilisant la commande <code>adduid</code> du prompt gpg. Vous devez pour cela commencer par éditer votre clé maître : | ||
<pre>gpg | <pre>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
Puis entrer la commande <code>adduid</code> au prompt gpg. Terminez avec <code>save</code>. | Puis entrer la commande <code>adduid</code> au prompt gpg. Terminez avec <code>save</code>. | ||
<pre> | <pre> | ||
Ligne 51 : | Ligne 105 : | ||
Si vous rencontrez un problème lors de la génération d'un uid, éditez la clé avec l'argument <code>--allow-freeform-uid</code> | Si vous rencontrez un problème lors de la génération d'un uid, éditez la clé avec l'argument <code>--allow-freeform-uid</code> | ||
Pour définir l'uid par défaut, ouvrez la clé avec <code>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</code>. Vous devriez voir la liste des uids ainsi qu'un numéro. Il faut sélectionner le numéro de l'uid souhaité avec <code>uid</code> puis le valide avec <code>primary</code> : | |||
<pre> | |||
gpg> uid 2 | |||
gpg> primary | |||
gpg> save | |||
</pre> | |||
=Facultatif: signer votre nouvelle clé avec votre ancienne clé (si vous en possédiez une)= | |||
Si vous possédez une précédente clé, et qu'elle est dans le même trousseau maître : | |||
<pre> | |||
gpg --default-key OLDKEYID --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
gpg> sign | |||
Really sign all user IDs? (y/N) y | |||
<vérifier les informations> | |||
Really sign? (y/N) y | |||
gpg> save | |||
</pre> | |||
Vous pouvez vérifier les signatures : | |||
<pre>gpg --check-signatures</pre> | |||
Ou voir la liste complète : | |||
<pre>gpg --list-signatures</pre> | |||
=Ajout des sous-clés (subkeys)= | =Ajout des sous-clés (subkeys)= | ||
Ligne 57 : | Ligne 137 : | ||
Pour commencer, nous allons créer une subkey de signature. Commencez par ouvrir votre clé maître : | Pour commencer, nous allons créer une subkey de signature. Commencez par ouvrir votre clé maître : | ||
<pre>gpg -- | <pre>gpg --expert --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (sign only)</code>, la taille <code>4096</code> et éventuellement une date d'expiration (dans mon cas, | Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (sign only)</code>, la taille <code>4096</code> et éventuellement une date d'expiration (dans mon cas, 1 an). Terminez en sauvegardant la clé (<code>save</code>) : | ||
<pre> | <pre> | ||
addkey | gpg> addkey | ||
(4) RSA (sign only) | (4) RSA (sign only) | ||
4096 | 4096 | ||
1y | |||
save | gpg> save | ||
</pre> | </pre> | ||
Ligne 71 : | Ligne 151 : | ||
Nous allons maintenant créer une subkey de chiffrement. Commencez par ouvrir votre clé maître : | Nous allons maintenant créer une subkey de chiffrement. Commencez par ouvrir votre clé maître : | ||
<pre>gpg -- | <pre>gpg --expert --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (encrypt only)</code>, la taille <code>4096</code> et éventuellement une date d'expiration (dans mon cas, | Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (encrypt only)</code>, la taille <code>4096</code> et éventuellement une date d'expiration (dans mon cas, 1 an). Terminez en sauvegardant la clé (<code>save</code>) : | ||
<pre> | <pre> | ||
addkey | gpg> addkey | ||
(6) RSA (encrypt only) | (6) RSA (encrypt only) | ||
4096 | 4096 | ||
1y | |||
save | gpg> save | ||
</pre> | </pre> | ||
==Clé d'authentification== | ==Clé d'authentification== | ||
Enfin, créons une subkey d'authentification | Enfin, créons une subkey d'authentification : | ||
<pre>gpg | <pre>gpg --expert --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (set your own capabilities)</code>, 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, | Au prompt gpg, utilisez la commande <code>addkey</code>. Utilisez le type <code>RSA (set your own capabilities)</code>, 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, 1 an). Terminez en sauvegardant la clé (<code>save</code>). Au prompt gpg on obtient : | ||
<pre> | <pre> | ||
addkey | gpg> addkey | ||
(8) RSA (set your own capabilities) | (8) RSA (set your own capabilities) | ||
(S) Toggle the sign capability (on désactive la signature activé par défaut) | (S) Toggle the sign capability (on désactive la signature activé par défaut) | ||
Ligne 95 : | Ligne 175 : | ||
(Q) Finished | (Q) Finished | ||
4096 | 4096 | ||
1y | |||
save | gpg> save | ||
</pre> | </pre> | ||
Ligne 102 : | Ligne 182 : | ||
A ce stade, vous devriez vous retrouver avec quelque chose comme ça : | A ce stade, vous devriez vous retrouver avec quelque chose comme ça : | ||
<pre> | <pre> | ||
$ gpg | $ gpg --list-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
pub rsa8192/ | pub rsa8192/0x99FD9BFE6F9B8951 2017-07-07 [C] | ||
Key fingerprint = 7EBA 8211 BFF5 31EE 59E2 5CBD 99FD 9BFE 6F9B 8951 | |||
uid [ultimate] testuser <testuser@domain.tld> | uid [ultimate] testuser <testuser@domain.tld> | ||
sub rsa4096/ | sub rsa4096/0x0B4D29418F92CF1D 2017-07-07 [S] | ||
sub rsa4096/ | sub rsa4096/0x91B74A739D6A4242 2017-07-07 [E] | ||
sub rsa4096/ | sub rsa4096/0x256A58F8E560F1D7 2017-07-07 [A] | ||
</pre> | </pre> | ||
<pre> | <pre> | ||
$ gpg | $ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
sec rsa8192/ | sec rsa8192/0x99FD9BFE6F9B8951 2017-07-07 [C] | ||
Key fingerprint = 7EBA 8211 BFF5 31EE 59E2 5CBD 99FD 9BFE 6F9B 8951 | |||
uid [ultimate] testuser <testuser@domain.tld> | uid [ultimate] testuser <testuser@domain.tld> | ||
ssb rsa4096/ | ssb rsa4096/0x0B4D29418F92CF1D 2017-07-07 [S] | ||
ssb rsa4096/ | ssb rsa4096/0x91B74A739D6A4242 2017-07-07 [E] | ||
ssb rsa4096/ | ssb rsa4096/0x256A58F8E560F1D7 2017-07-07 [A] | ||
</pre> | </pre> | ||
Vous pouvez vérifier l'état de votre installation au moyen du paquet <code>hopenpgp-tools</code> : | |||
<pre>gpg --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | hokey lint</pre> | |||
<pre>gpg -- | |||
=Générer un certificat de révocation pour la clé maître= | =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 <code> 1 = Key has been compromised</code> 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. | Créez un certificat de révocation pour votre clé maître. Utilisez le flag <code> 1 = Key has been compromised</code> 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. | ||
<pre>gpg | <pre>gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey.gpg-revocation-certificate.key --gen-revoke 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
Decision : 1 = Key has been compromised | Decision : 1 = Key has been compromised | ||
> This revocation certificate was generated when the key was created. | > This revocation certificate was generated when the key was created. | ||
Ligne 137 : | Ligne 218 : | ||
* Sauvegarde des clés privés : | * Sauvegarde des clés privés : | ||
<pre>gpg | <pre>gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).priv.key --armor --export-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
<pre>gpg -- | <pre>gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only_$(date +%Y%m%d).priv.key --armor --export-secret-subkeys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
* Sauvegarde des clés publiques : | * Sauvegarde des clés publiques : | ||
<pre>gpg -- | <pre>gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).pub.gpg --armor --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
=Publication de la clé maîtres et des sous-clés sur les keyservers= | |||
<pre> | |||
gpg --keyserver hkp://keyserver.ubuntu.com --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
gpg --keyserver hkp://pool.sks-keyservers.net --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
gpg --keyserver hkp://keys.openpgp.org --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
gpg --keyserver hkp://pgp.mit.edu --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
</pre> | |||
Vous pouvez aussi la publier localement sur votre site en WKD : [[GnuPG Web Key Directory : partage de clés gpg par le web]] | |||
=Utilisation de votre clé= | |||
==Directement sur votre machine (sans smartcard)== | |||
Sortez de votre trousseau maître : | |||
<pre> | |||
unset GNUPGHOME | |||
gpgconf --kill gpg-agent | |||
</pre> | |||
Attention, désormais vous travaillerez dans le trousseau principal votre machine (<code>/home/USER/.gnupg/</code>) | |||
Importez les subkeys dans votre trousseau gpg local : | Importez les subkeys dans votre trousseau gpg local : | ||
<pre>gpg --import /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/ | <pre>gpg --import /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only_$(date +%Y%m%d).priv.key</pre> | ||
<br> | |||
'''A ce stade, vous pouvez éjecter et débrancher votre média usb.''' | |||
<br><br> | |||
Editez la clé et définissez son niveau de confiance au maximum : | Editez la clé et définissez son niveau de confiance au maximum : | ||
<pre>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | <pre>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
<pre> | <pre> | ||
trust | gpg> trust | ||
5 | 5 | ||
save | gpg> save | ||
</pre> | </pre> | ||
Ligne 159 : | Ligne 265 : | ||
<pre> | <pre> | ||
$ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | $ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
sec# rsa8192 2017-07-07 [ | sec# rsa8192 2017-07-07 [C] | ||
7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
uid [ultimate] testuser <testuser@domain.tld> | uid [ultimate] testuser <testuser@domain.tld> | ||
Ligne 169 : | Ligne 275 : | ||
Notez le dièse (#) a côté du <code>sec</code> qui signifie que la clé privé maître est absente. | Notez le dièse (#) a côté du <code>sec</code> qui signifie que la clé privé maître est absente. | ||
= | ==Avec une smartcard== | ||
Dans ce cas, nous continuons à travailler sur le trousseau maître (variable <code>GNUPGHOME</code>). | |||
<pre>gpg --card-edit</pre> | Branchez votre smartcard, éditez la avec gpg et activez les commandes admin : | ||
<pre> | |||
gpg --card-edit | |||
gpg> admin | |||
</pre> | |||
Configurez ces différentes options : | |||
<pre> | <pre> | ||
passwd (changer le pin, admin pin et reset code) | |||
passwd (changer le pin, admin pin et reset | |||
(le pin sera demandé a chaque opération avec la clé) | (le pin sera demandé a chaque opération avec la clé) | ||
name (définir son nom) | name (définir son nom) | ||
Ligne 184 : | Ligne 294 : | ||
</pre> | </pre> | ||
Attention, sauvegardez bien | Le PIN par défaut est <code>123456</code> tandis que le ADmin PIN et <code>12345678</code>. Les PINs peuvent être définis jusqu'à 127 caractères ASCII pour une longueur minimale de 6 caractères (PIN) et 8 caractères (Admin PIN). | ||
Attention, modifiez puis sauvegardez bien les différents PINs : | |||
* Le Pin sera demandé pour les opérations de chiffrement, signature ou authentification avec la smartcard. Il se bloque après 3 essais infructueux. | |||
* Le Admin PIN permet de débloquer le pin, le modifier, et modifier les clés stockés. | |||
* Le Reset code permet de remettre à zéro le compteur du PIN principal si vous avez fait 3 essais infructueux. | |||
<br>Créez 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..) : | |||
<pre> | <pre> | ||
cd /media/veracrypt1/GNUPG_HOME/ | cd /media/veracrypt1/GNUPG_HOME/ | ||
tar -cf | tar -cf HOME_$(date +%Y%m%d).tar HOME/ | ||
cd | cd | ||
</pre> | </pre> | ||
Ouvrez votre clé maître : | Ouvrez votre clé maître : | ||
<pre>gpg -- | <pre>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
Afin de transférer chaque sous-clé sur la smartcard, il faut activer la | Afin de transférer chaque sous-clé sur la smartcard, il faut activer la sélection avec la commande <code>toggle</code> puis les sélectionner une à une avec la commande <code>key <NUMÉRO></code>. La clé sélectionné s'affichera suivi d'une étoile (*). Pour la transférer, on lance la commande <code>keytocard</code> puis on sélectionne le bon slot sur la smartcard. Pour savoir quelle clé doit aller dans quel slot, aidez vous de la ligne <code>usage</code> : S pour Signature, E pour Encryption, A pour Authentification. | ||
==Transfert de la clé de signature== | ===Transfert de la clé de signature=== | ||
<pre> | <pre> | ||
gpg> toggle | gpg> toggle | ||
gpg> key 1 (sélectionne la clé 1) | gpg> key 1 (sélectionne la clé 1) | ||
sec rsa8192/99FD9BFE6F9B8951 | sec rsa8192/99FD9BFE6F9B8951 | ||
created: 2017-07-07 expires: never usage: | created: 2017-07-07 expires: never usage: C | ||
trust: ultimate validity: ultimate | trust: ultimate validity: ultimate | ||
ssb* rsa4096/0B4D29418F92CF1D | ssb* rsa4096/0B4D29418F92CF1D | ||
Ligne 227 : | Ligne 342 : | ||
sec rsa8192/99FD9BFE6F9B8951 | sec rsa8192/99FD9BFE6F9B8951 | ||
created: 2017-07-07 expires: never usage: | created: 2017-07-07 expires: never usage: C | ||
trust: ultimate validity: ultimate | trust: ultimate validity: ultimate | ||
ssb* rsa4096/0B4D29418F92CF1D | ssb* rsa4096/0B4D29418F92CF1D | ||
Ligne 241 : | Ligne 356 : | ||
</pre> | </pre> | ||
==Transfert de la clé de chiffrement== | ===Transfert de la clé de chiffrement=== | ||
<pre> | <pre> | ||
gpg> key 2 (sélectionne la clé 2) | gpg> key 2 (sélectionne la clé 2) | ||
Ligne 269 : | Ligne 384 : | ||
sec rsa8192/99FD9BFE6F9B8951 | sec rsa8192/99FD9BFE6F9B8951 | ||
created: 2017-07-07 expires: never usage: | created: 2017-07-07 expires: never usage: C | ||
trust: ultimate validity: ultimate | trust: ultimate validity: ultimate | ||
ssb rsa4096/0B4D29418F92CF1D | ssb rsa4096/0B4D29418F92CF1D | ||
Ligne 284 : | Ligne 399 : | ||
</pre> | </pre> | ||
==Transfert de la clé d'authentification== | ===Transfert de la clé d'authentification=== | ||
<pre> | <pre> | ||
Ligne 329 : | Ligne 444 : | ||
gpg> key 3 (desélectionne la clé) | gpg> key 3 (desélectionne la clé) | ||
</pre> | </pre> | ||
==Vérification après transfert== | ===Finalisation du transfert=== | ||
<pre>gpg> save</pre> | |||
===Vérification après transfert=== | |||
La commande suivante : | La commande suivante : | ||
<pre>gpg | <pre>gpg --list-secret-keys</pre> | ||
Devrait retourner : | Devrait retourner quelque chose ressemblant à : | ||
<pre> | <pre> | ||
sec rsa8192 2017-07-07 [ | sec rsa8192 2017-07-07 [C] | ||
7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
uid [ultimate] testuser <testuser@domain.tld> | uid [ultimate] testuser <testuser@domain.tld> | ||
Ligne 349 : | Ligne 467 : | ||
Notez le symbole <code>></code> a côté des <code>ssb</code> qui signifie que la clé privé est stocké sur une smartcard. | Notez le symbole <code>></code> a côté des <code>ssb</code> qui signifie que la clé privé est stocké sur une smartcard. | ||
==Restauration de votre trousseau maître== | ===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. | 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. | ||
<pre> | <pre> | ||
cd /media/veracrypt1/GNUPG_HOME/ | cd /media/veracrypt1/GNUPG_HOME/ | ||
srm -vr HOME/ | |||
tar -xf HOME_$(date +%Y%m%d).tar | |||
tar -xf | |||
cd | cd | ||
</pre> | </pre> | ||
==Export et importation des clés publiques sur votre trousseau local== | ===Export et importation des clés publiques sur votre trousseau local=== | ||
Exportez votre clé publique depuis votre trousseau maître : | |||
<pre>gpg --armor --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 > ~/gpg_pubkey.gpg</pre> | |||
<br> | |||
<pre> | '''A ce stade, vous pouvez éjecter et débrancher votre média usb.''' | ||
<br><br> | |||
Arrêtez de travailler dans votre trousseau maître : | |||
<pre> | |||
unset GNUPGHOME | |||
gpgconf --kill gpg-agent | |||
</pre> | |||
Puis importez | Puis importez votre clé publique dans le trousseau par défaut de gpg. Il est nécessaire de lancer un card-status pour que gpg détecte les clés privées. | ||
<pre>gpg --import < ~/gpg_pubkey.gpg</pre> | <pre> | ||
gpg --import < ~/gpg_pubkey.gpg | |||
gpg --card-status | |||
</pre> | |||
Accordez une confiance totale à votre clé : | Accordez une confiance totale à votre clé : | ||
<pre>gpg --edit-key </pre> | <pre>gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | ||
<pre> | <pre> | ||
trust | gpg> trust | ||
5 | 5 | ||
save | gpg> save | ||
</pre> | </pre> | ||
Ligne 381 : | Ligne 510 : | ||
Devrait retourner : | Devrait retourner : | ||
<pre> | <pre> | ||
sec# rsa8192 2017-07-07 [ | sec# rsa8192 2017-07-07 [C] | ||
7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | ||
uid [ultimate] testuser <testuser@domain.tld> | uid [ultimate] testuser <testuser@domain.tld> | ||
Ligne 390 : | Ligne 519 : | ||
Notez encore une foi le symbole dièse (<code>#</code>) qui signifie que la clé privée maître n'est pas disponible dans ce trousseau, et le symbole <code>></code> qui signifie que les sous-clés privés sont stockés sur une smartcard. | Notez encore une foi le symbole dièse (<code>#</code>) qui signifie que la clé privée maître n'est pas disponible dans ce trousseau, et le symbole <code>></code> qui signifie que les sous-clés privés sont stockés sur une smartcard. | ||
==Yubikey: Imposer de toucher la yubikey pour les opérations openpgp== | |||
Par défaut, lors d'une première opération avec le smartcard, le PIN vous sera demandé. Le PIN sera ensuite mis en cache dans la yubikey (pas dans gpg-agent), et le seul moyen de vider le cache est de débrancher/rebrancher la smartcard. Vous pouvez ajouter une coucher de sécurité en imposant de touche la yubikey afin de valider l'opération (ainsi, une action physique est nécessaire).<br><br> | |||
Cela n'est possible que depuis les Yubikeys 4.<br> | |||
Pour chaque type de clé, vous pouvez définir 4 statut : | |||
<pre> | |||
Off (default) No touch required | |||
On Touch required | |||
Fixed Touch required, can't be disabled without a full reset | |||
Cached Touch required, cached for 15s after use | |||
Cached-Fixed Touch required, cached for 15s after use, can't be disabled | |||
without a full reset | |||
</pre> | |||
Attention, notez bien que si vous activez le mode <code>Cached-Fixed</code> ou <code>Fixed</code>, vous ne pourrez plus modifier cette configuration sans remettre à zéro totalement la smardcard de la yubikey ! | |||
<pre> | |||
ykman openpgp keys set-touch sig on | |||
ykman openpgp keys set-touch enc on | |||
ykman openpgp keys set-touch aut on | |||
ykman openpgp keys set-touch att on | |||
</pre> | |||
Sous linux, vous pouvez installer https://github.com/maximbaz/yubikey-touch-detector pour être averti visuellement de la nécessité de toucher la yubikey | |||
Note : il semblerait que killer l'agent (<code>gpgconf --kill gpg-agent</code>) ou le smartcard daemon (<code>gpgconf --kill scdaemon</code>) permette à GPG de redemander le pin. Néanmoins dans les faits cela provoque uniquement une désynchronisation entre l'état de l'applet GPG de la yubikey (qui est déverrouillé) et l'état connu par gpg-agent (qui pense l'applet verrouillé). Pour preuve, constatez que vous pouvez taper autant de pin erroné que souhaitez sans bloquer l'applet de la yubikey (normalement après 3 erreurs, le PIN est bloqué) | |||
=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.<br> | |||
Les opérations suivantes nécessitent d'être réalisées avec votre trousseau maître (celui stocké sur le média usb) (<code>gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/</code> ou alors avec la variable d'environnement <code>GNUPGHOME=/media/veracrypt1/GNUPG_HOME/HOME/</code> définie) : | |||
* Ajouter une identité/uid (par exemple si vous changez d'adresse mail) à votre clé | |||
* Signer la clé de quelqu'un d'autre : <code>gpg --sign-key 0xKEY_TO_SIGN</code> 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) : <code>gpg --send-keys --keyserver <serveur de clé> 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</code> | |||
==Exemple pour révoquer une sous-clé== | |||
<pre> | |||
gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | |||
key 1 (selectionne la subkey numéro 1) | |||
revkey | |||
save | |||
</pre> | |||
Mettez également à jour le backup de votre clé publique, afin qu'il reflète le nouvel état : | |||
<pre>gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).pub.gpg --export --armor 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951</pre> | |||
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é) |
Version du 5 novembre 2021 à 20:19
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'
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).
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/ gpg --homedir /media/veracrypt1/GNUPG_HOME/HOME/ -k
Assurez-vous de ne pas avoir d'ancien agent gpg lancé :
gpgconf --kill gpg-agent unset GPG_AGENT_INFO
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=/run/user/${UID}/gnupg/S.SecureDisk-gpg-agent EOF
Créer une configuration sécurisée
Ajoutez ou modifiez les options suivantes dans /media/veracrypt1/GNUPG_HOME/HOME/gpg.conf
:
personal-cipher-preferences AES256 AES192 AES personal-digest-preferences SHA512 SHA384 SHA256 personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed default-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed cert-digest-algo SHA512 s2k-digest-algo SHA512 s2k-cipher-algo AES256 charset utf-8 keyid-format 0xlong with-fingerprint no-symkey-cache
Forcer le travail sur notre trousseau gpg maitre
Pour cela il y a deux manières de faire : soit spécifier, a chaque commande gpg l'argument --homedir /media/veracrypt1/GNUPG_HOME/HOME/
soit définir la variable d'environnement GNUPGHOME :
export GNUPGHOME=/media/veracrypt1/GNUPG_HOME/HOME/
Pour la suite, nous considérerons que vous avez défini la variable GNUPGHOME
Dans le doute, vérifiez bien que gpg-agent n'est pas lancé:
gpgconf --kill gpg-agent
Générer la clé maître
Généralement, la commande permettant de créer une clé la plus malléable possible est :
gpg --expert --full-generate-key
Ici 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éez 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 Name-Real: testuser #Name-Comment: Name-Email: testuser@domain.tld Expire-Date: 10y Passphrase: tmppassphrasepleaseedit # Do a commit here, so that we can later print "done" %commit %echo done EOF
Notez qu'ici, notre clé maitre est configurée de manière à ne pouvoir réaliser que des opérations de certification d'autres clés (flag C
ou cert
).
Notre clé maître est définie avec une expiration de 10 ans. Je vous conseil de toujours définir une date d'expiration à vos clés afin qu'elles expirent d'elles-mêmes si jamais vous la perdiez. Notez que la date d'expiration d'une clé gpg est modifiable a souhait, y compris après expiration, du moment que vous n'avez pas perdu la clé maître.
Générez la clé maître dans le trousseau gpg maître que nous avons créé :
gpg --batch --gen-key --enable-large-rsa -a newkey
Dans cet exemple, la clé créée a l'identifiant 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
.
Ajout et modification des UIDs de la clé maître
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 --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
Pour définir l'uid par défaut, ouvrez la clé avec gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
. Vous devriez voir la liste des uids ainsi qu'un numéro. Il faut sélectionner le numéro de l'uid souhaité avec uid
puis le valide avec primary
:
gpg> uid 2 gpg> primary gpg> save
Facultatif: signer votre nouvelle clé avec votre ancienne clé (si vous en possédiez une)
Si vous possédez une précédente clé, et qu'elle est dans le même trousseau maître :
gpg --default-key OLDKEYID --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 gpg> sign Really sign all user IDs? (y/N) y <vérifier les informations> Really sign? (y/N) y gpg> save
Vous pouvez vérifier les signatures :
gpg --check-signatures
Ou voir la liste complète :
gpg --list-signatures
Ajout des sous-clés (subkeys)
Clé de signature
Pour commencer, nous allons créer une subkey de signature. Commencez par ouvrir votre clé maître :
gpg --expert --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, 1 an). Terminez en sauvegardant la clé (save
) :
gpg> addkey (4) RSA (sign only) 4096 1y gpg> save
Clé de chiffrement
Nous allons maintenant créer une subkey de chiffrement. Commencez par ouvrir votre clé maître :
gpg --expert --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, 1 an). Terminez en sauvegardant la clé (save
) :
gpg> addkey (6) RSA (encrypt only) 4096 1y gpg> save
Clé d'authentification
Enfin, créons une subkey d'authentification :
gpg --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, 1 an). Terminez en sauvegardant la clé (save
). Au prompt gpg on obtient :
gpg> 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 1y gpg> save
Etat des lieux
A ce stade, vous devriez vous retrouver avec quelque chose comme ça :
$ gpg --list-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 pub rsa8192/0x99FD9BFE6F9B8951 2017-07-07 [C] Key fingerprint = 7EBA 8211 BFF5 31EE 59E2 5CBD 99FD 9BFE 6F9B 8951 uid [ultimate] testuser <testuser@domain.tld> sub rsa4096/0x0B4D29418F92CF1D 2017-07-07 [S] sub rsa4096/0x91B74A739D6A4242 2017-07-07 [E] sub rsa4096/0x256A58F8E560F1D7 2017-07-07 [A]
$ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 sec rsa8192/0x99FD9BFE6F9B8951 2017-07-07 [C] Key fingerprint = 7EBA 8211 BFF5 31EE 59E2 5CBD 99FD 9BFE 6F9B 8951 uid [ultimate] testuser <testuser@domain.tld> ssb rsa4096/0x0B4D29418F92CF1D 2017-07-07 [S] ssb rsa4096/0x91B74A739D6A4242 2017-07-07 [E] ssb rsa4096/0x256A58F8E560F1D7 2017-07-07 [A]
Vous pouvez vérifier l'état de votre installation au moyen du paquet hopenpgp-tools
:
gpg --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 | hokey lint
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 --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey.gpg-revocation-certificate.key --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.
Sauvegarde de la clé maître et ses sous-clés
- Sauvegarde des clés privés :
gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).priv.key --armor --export-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only_$(date +%Y%m%d).priv.key --armor --export-secret-subkeys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
- Sauvegarde des clés publiques :
gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).pub.gpg --armor --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Publication de la clé maîtres et des sous-clés sur les keyservers
gpg --keyserver hkp://keyserver.ubuntu.com --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 gpg --keyserver hkp://pool.sks-keyservers.net --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 gpg --keyserver hkp://keys.openpgp.org --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 gpg --keyserver hkp://pgp.mit.edu --send-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Vous pouvez aussi la publier localement sur votre site en WKD : GnuPG Web Key Directory : partage de clés gpg par le web
Utilisation de votre clé
Directement sur votre machine (sans smartcard)
Sortez de votre trousseau maître :
unset GNUPGHOME gpgconf --kill gpg-agent
Attention, désormais vous travaillerez dans le trousseau principal votre machine (/home/USER/.gnupg/
)
Importez les subkeys dans votre trousseau gpg local :
gpg --import /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/subkey_only_$(date +%Y%m%d).priv.key
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
gpg> trust 5 gpg> save
Vérifiez l'importation :
$ gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 sec# rsa8192 2017-07-07 [C] 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.
Avec une smartcard
Dans ce cas, nous continuons à travailler sur le trousseau maître (variable GNUPGHOME
).
Branchez votre smartcard, éditez la avec gpg et activez les commandes admin :
gpg --card-edit gpg> admin
Configurez ces différentes options :
passwd (changer le pin, admin pin et reset code) (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
Le PIN par défaut est 123456
tandis que le ADmin PIN et 12345678
. Les PINs peuvent être définis jusqu'à 127 caractères ASCII pour une longueur minimale de 6 caractères (PIN) et 8 caractères (Admin PIN).
Attention, modifiez puis sauvegardez bien les différents PINs :
- Le Pin sera demandé pour les opérations de chiffrement, signature ou authentification avec la smartcard. Il se bloque après 3 essais infructueux.
- Le Admin PIN permet de débloquer le pin, le modifier, et modifier les clés stockés.
- Le Reset code permet de remettre à zéro le compteur du PIN principal si vous avez fait 3 essais infructueux.
Créez 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_$(date +%Y%m%d).tar HOME/ cd
Ouvrez votre clé maître :
gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Afin de transférer chaque sous-clé sur la smartcard, il faut activer la sélection 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.
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: C 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: 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> key 1 (desélectionne la clé)
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: 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> key 2 (desélectionne la clé)
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é)
Finalisation du transfert
gpg> save
Vérification après transfert
La commande suivante :
gpg --list-secret-keys
Devrait retourner quelque chose ressemblant à :
sec rsa8192 2017-07-07 [C] 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.
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/ srm -vr HOME/ tar -xf HOME_$(date +%Y%m%d).tar cd
Export et importation des clés publiques sur votre trousseau local
Exportez votre clé publique depuis votre trousseau maître :
gpg --armor --export 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 > ~/gpg_pubkey.gpg
A ce stade, vous pouvez éjecter et débrancher votre média usb.
Arrêtez de travailler dans votre trousseau maître :
unset GNUPGHOME gpgconf --kill gpg-agent
Puis importez votre clé publique dans le trousseau par défaut de gpg. Il est nécessaire de lancer un card-status pour que gpg détecte les clés privées.
gpg --import < ~/gpg_pubkey.gpg gpg --card-status
Accordez une confiance totale à votre clé :
gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
gpg> trust 5 gpg> save
Puis vérifiez votre installation finale :
gpg --list-secret-keys 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Devrait retourner :
sec# rsa8192 2017-07-07 [C] 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.
Yubikey: Imposer de toucher la yubikey pour les opérations openpgp
Par défaut, lors d'une première opération avec le smartcard, le PIN vous sera demandé. Le PIN sera ensuite mis en cache dans la yubikey (pas dans gpg-agent), et le seul moyen de vider le cache est de débrancher/rebrancher la smartcard. Vous pouvez ajouter une coucher de sécurité en imposant de touche la yubikey afin de valider l'opération (ainsi, une action physique est nécessaire).
Cela n'est possible que depuis les Yubikeys 4.
Pour chaque type de clé, vous pouvez définir 4 statut :
Off (default) No touch required On Touch required Fixed Touch required, can't be disabled without a full reset Cached Touch required, cached for 15s after use Cached-Fixed Touch required, cached for 15s after use, can't be disabled without a full reset
Attention, notez bien que si vous activez le mode Cached-Fixed
ou Fixed
, vous ne pourrez plus modifier cette configuration sans remettre à zéro totalement la smardcard de la yubikey !
ykman openpgp keys set-touch sig on ykman openpgp keys set-touch enc on ykman openpgp keys set-touch aut on ykman openpgp keys set-touch att on
Sous linux, vous pouvez installer https://github.com/maximbaz/yubikey-touch-detector pour être averti visuellement de la nécessité de toucher la yubikey
Note : il semblerait que killer l'agent (gpgconf --kill gpg-agent
) ou le smartcard daemon (gpgconf --kill scdaemon
) permette à GPG de redemander le pin. Néanmoins dans les faits cela provoque uniquement une désynchronisation entre l'état de l'applet GPG de la yubikey (qui est déverrouillé) et l'état connu par gpg-agent (qui pense l'applet verrouillé). Pour preuve, constatez que vous pouvez taper autant de pin erroné que souhaitez sans bloquer l'applet de la yubikey (normalement après 3 erreurs, le PIN est bloqué)
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/
ou alors avec la variable d'environnement GNUPGHOME=/media/veracrypt1/GNUPG_HOME/HOME/
définie) :
- Ajouter une identité/uid (par exemple si vous changez d'adresse mail) à votre clé
- Signer la clé de quelqu'un d'autre :
gpg --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 --send-keys --keyserver <serveur de clé> 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
Exemple pour révoquer une sous-clé
gpg --edit-key 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951 key 1 (selectionne la subkey numéro 1) revkey save
Mettez également à jour le backup de votre clé publique, afin qu'il reflète le nouvel état :
gpg --output /media/veracrypt1/GNUPG_HOME/KEY_BACKUP/masterkey_and_subkey_$(date +%Y%m%d).pub.gpg --export --armor 7EBA8211BFF531EE59E25CBD99FD9BFE6F9B8951
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é)