J’utilise une YubiKey comme clé d’authentification à deux facteurs et pour signer mes commits Git. Jusqu’à il y a quelques jours, j’utilisais une YubiKey 4. Comme mon ordinateur actuel n’a aucun port USB-A, je jongle depuis un an avec des adaptateurs USB-A vers USB-C dans mon sac à dos, et utiliser la clé est devenu une vraie galère. C’est pour ça que j’ai décidé qu’il était temps de passer à ma « nouvelle » YubiKey 5C, et de ne plus avoir à jongler avec ces adaptateurs.

En fait, j’ai cette clé depuis un moment : je l’avais commandée en même temps qu’une YubiKey 4 de remplacement, à cause du problème du TPM Infineon qu’ils avaient identifié, mais ce n’est que maintenant que je me décide à passer à la nouvelle clé.

L’autre raison de le faire maintenant, c’est que mes anciennes clés GPG ont expiré et que j’ai dû les réémettre, donc je peux utiliser la clé pour signer mes commits Git.

La folie GPG

Si vous avez déjà eu affaire aux clés GPG (ou si c’est le cas en ce moment), vous savez qu’il peut être assez difficile de tout mettre en place correctement et en toute sécurité quand on ne l’a jamais fait. Garder les clés maîtresses hors ligne, faire circuler les clés publiques, réémettre les clés quand elles expirent, éventuellement les signer avec les clés précédentes pour les vérifier, révoquer des clés… Il n’est déjà pas facile de suivre les bonnes pratiques en théorie. Quand il s’agit de les appliquer en pratique, ça devient extrêmement compliqué.

La plupart des tutoriels en ligne expliquent comment générer ses clés en ligne de commande, en naviguant dans des menus au design peu commun, et c’est une vraie plaie à mettre en place. La plupart disent d’utiliser une machine hors ligne, comme un Raspberry PI, et/ou de générer les clés maîtresses et les sous-clés hors ligne, puis de garder la clé maîtresse loin de votre ordinateur.

🤯

Je me coltine ça chaque début de janvier depuis presque 4 ans. Je redoute le moment où j’obtiens l’erreur suivante, qui m’indique que mes clés de signature ont expiré.

error: gpg failed to sign the data
fatal: failed to write commit object

Cette année, j’ai décidé qu’il était temps d’essayer de rendre ce processus beaucoup plus simple, en utilisant la génération de certificats intégrée et en évitant toute la galère de la génération de clés GPG et compagnie.

Génération des clés directement sur la YubiKey

Il faut toujours passer par l’interface en ligne de commande, mais c’est un peu plus évident, car il y a moins d’étapes.

Il faut d’abord configurer la carte/l’appareil.

Configuration de la carte/de l’appareil

Lancez gpg --card-status dans le terminal et vous devriez voir quelque chose comme ceci :

Reader ………..: Yubico Yubikey 4 OTP U2F CCID
Application ID …: <Serial number>
Version ……….: 2.1
Manufacturer …..: Yubico
Serial number ….: <Device serial number>
Name of cardholder: unspecified
Language prefs …: en
Sex …………..: unspecified
URL of public key : \[not set\]
Login data …….: <e-mail or nothing>
Signature PIN ….: not forced
Key attributes …: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 9

Si vous voyez quelque chose de similaire et qu’aucune erreur n’apparaît, vous pouvez continuer.

Lancez gpg --card-edit

Vous arriverez dans une interface en ligne de commande qui affiche les mêmes informations qu’au début, puis une invite de commande en bas : gpg/card>.

Tapez admin et appuyez sur Entrée.

Vous pouvez maintenant taper help pour découvrir comment modifier les informations du titulaire et les codes PIN de la carte.

Il y a une chose que vous DEVEZ faire : changer les codes PIN par défaut de la carte. Il y en a deux. Le premier est le code PIN que vous utilisez pour accéder aux clés de la carte. Le second est le PIN « Admin » ou PUK (Personal Unblocking Code, code de déblocage personnel).

Pour cela, tapez passwd et vous verrez un menu :

gpg/card> passwd  
gpg: OpenPGP card no. <Serial number> detected

1 - change PIN  
2 - unblock PIN  
3 - change Admin PIN  
4 - set the Reset Code  
Q - quit

Tapez 1 et suivez les instructions pour changer votre PIN. Le PIN par défaut est 123456.

Ensuite, choisissez 3 pour changer le PIN Admin. Celui par défaut est 12345678.

Une fois les deux PIN changés, revenez au menu principal pour terminer la mise à jour des informations de la clé.

Les commandes que vous pouvez utiliser sont :

  • name – pour changer le nom du titulaire
  • login – pour changer l’adresse e-mail ou l’identifiant du titulaire

Après cela, nous pouvons passer à la génération des clés proprement dite.

Génération des clés

Il est maintenant temps de générer les clés.

Pour cela, tapez generate.

On vous demandera Make off-card backup of encryption key? (Y/n), mais comme l’indique la documentation de YubiKey, il ne s’agit que d’une sauvegarde factice qui ne crée pas de sauvegarde complète des clés secrètes, donc peu importe que vous répondiez Yes ou No. Je réponds No(n).

S’il y a déjà des clés stockées sur la carte, on vous demandera si vous voulez les remplacer :

gpg: Note: keys are already stored on the card!

Replace existing keys? (y/N)

Assurez-vous de ne pas remplacer quelque chose d’important dont vous n’avez pas de sauvegarde, puis continuez avec Y. S’il y a quelque chose d’important, mieux vaut quitter tout le processus avec Ctrl+C.

On vous demandera le code PIN de la carte que vous avez défini plus tôt.

Ensuite, vous devrez choisir la durée de validité des clés :

Please specify how long the key should be valid.
        0 = key does not expire
      <n> = key expires in n days
     <n>w = key expires in n weeks
     <n>m = key expires in n months
     <n>y = key expires in n years
 Key is valid for? (0)

Si vous voulez que les clés ne soient valides qu’un an, tapez 1y.

On vous demandera de confirmer la date d’expiration. Vérifiez que tout est correct et confirmez.

Ensuite, on vous demandera de saisir les informations du propriétaire de la clé :

Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: <Your name>
Email address: <Your e-mail>
Comment: <Comment is optional>
 You selected this USER-ID:
     "<Your name> <comment> <your e-mail>
 Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

Type `O` to confirm if everything seems correct.

Ensuite, on vous demandera votre PIN Admin ou PUK. C’est nécessaire, car cela effectue une opération d’écriture sur la carte.

Si tout est correct, la YubiKey se mettra à clignoter et continuera un bon moment (pour moi, environ cinq minutes).

Une fois terminé, vous verrez le message suivant :

gpg: key <Short ID> marked as ultimately trusted
gpg: revocation certificate stored as '/Users/bisko/.gnupg/openpgp-revocs.d/<LONG ID>.rev' public and secret key created and signed.

Notez bien le <Short ID>, car nous l’utiliserons plus tard.

À ce stade, vous pouvez quitter l’invite GPG avec quit ou Ctrl+C.

Il est maintenant temps de sauvegarder la clé publique, afin de pouvoir réutiliser la clé sur un autre ordinateur.

Pour cela, lancez la commande suivante :

gpg --armor --export <Short ID> > <Short ID>.asc

Cela exportera la clé publique dans un fichier nommé <Short ID>.asc. Il vous servira plus tard si vous voulez utiliser la YubiKey sur un autre ordinateur ou si vous perdez votre configuration GPG.

Pour restaurer la clé publique dans votre trousseau, il faut faire :

gpg --import < <Short ID>.asc
gpg: key <Short ID>: public key "Your Name <your@email>" imported
gpg: Total number processed: 1
gpg: imported: 1

Une remarque très importante ici. S’il s’agit d’une nouvelle installation de GPG ou d’un autre ordinateur, GPG ne reconnaîtra pas tout seul les clés présentes sur la carte. Vous devez lancer gpg --card-status pour qu’il lise la carte et détecte les clés qui s’y trouvent.

Configurer Git pour la signature

Pour configurer Git afin qu’il signe vos commits, vous devez ajouter ce qui suit à votre ~/.gitconfig.

Dans la section [user], ajoutez (ou mettez à jour) la ligne suivante :

signingkey = 0x<Short ID>

Ensuite, si vous voulez signer tous vos commits, ajoutez ce qui suit à la fin du fichier :

[gpg]
  program = /usr/local/bin/gpg
[commit]
  gpgsign = true

Git signera alors tous vos commits.

Pour configurer GitHub, vous devez ajouter votre clé publique à votre profil. Pour cela, allez dans GitHub -> Settings -> SSH and GPG keys -> New GPG key.

Vous verrez alors une zone de texte dans laquelle vous devez coller tout le contenu du fichier <Short ID>.asc que nous avons généré plus haut.

Si vous voulez copier le contenu du fichier (sur macOS), vous pouvez faire :

cat <Short ID>.asc | pbcopy

Cela copiera le contenu de tout le fichier dans le presse-papiers.

Collez-le dans la zone de texte sur GitHub et cliquez sur le bouton Add GPG key.

Après ça, vous pouvez essayer de faire un commit et un push vers GitHub, et vous devriez voir le joli badge Verified.

Débogage

Parfois, les choses ne fonctionnent pas du premier coup. Pour obtenir plus d’informations, vous pouvez essayer ce qui suit :

Signer avec GPG

Essayez d’abord de signer quelque chose avec la clé :

gpg -s <file>

Si ça échoue, essayez de comprendre pourquoi. Je ne suis pas expert, donc je ne pourrai pas vous aider sur ce point.

Regardez la sortie de Git avecGIT_TRACE=1 git commit -am “test”

Cela vous donnera le détail de tout ce que Git fait quand il essaie de faire le commit et de le signer. Cela devrait vous donner une idée de la raison de l’échec de la signature.

Vous pouvez aussi y voir que Git exécute la commande suivante :

/usr/local/bin/gpg --status-fd=2 -bsau <Key ID>

Vous pouvez essayer de l’exécuter manuellement pour voir si elle vous donne une meilleure erreur.