Quand on dispose d’une sous-clé d’authentification GnuPG placé sur une carte à puce ou un périphérique qui émule une carte à puce (par exemple, au hasard, une YubiKey), il est nécessaire de définir la variable d’environnement SSH_AUTH_SOCK
vers le chemin de la socket de l’agent GnuPG.
C’est relativement simple à faire pour l’utiliser au sein d’un terminal mais quand il s’agit de le faire pour l’utilisation depuis des applications graphiques, cela est plus délicat. Nous allons donc voir une façon de faire dans cet article.
Pour obtenir le chemin de l’agent GPG, il suffit d’utiliser la commande :
gpgconf --list-dirs agent-ssh-socket
Qui dans mon cas me retourne :
/run/user/1000/gnupg/S.gpg-agent.ssh
Beaucoup d’articles sur Internet indiquent qu’il suffit donc de définir la variable SSH_AUTH_SOCK
dans le fichier de configuration de son shell (par exemple .bashrc
ou .zshrc
). Quelque chose comme :
SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
C’est pas mal et c’est fonctionnel, on peut se connecter à un serveur avec SSH et notre sous-clé d’authentification GPG sera bien utilisée.
Par contre, vu que le code est exécuté à l’ouverture d’un terminal (par exemple via GNOME Terminal), cela ne fonctionnera pas avec une application graphique comme PHPStorm, GitHub Desktop ou GitKraken par exemple. C’est gênant quand on utilise git via SSH dans ces applications car les opérations distantes échoueront.
La solution ? Définir la variable lors du démarrage de la session, avec systemd
par exemple.
Créer le fichier systemd
avec votre éditeur de texte favori :
nano ~/.config/systemd/user/ssh-auth-sock.service
Ajouter le code suivant :
[Unit]
Description=Définir SSH_AUTH_SOCK vers l'agent GnuPG
[Service]
Type=oneshot
ExecStartPre=/bin/bash -c 'cat /etc/xdg/autostart/gnome-keyring-ssh.desktop \
<(echo "Hidden=true") > %h/.config/autostart/gnome-keyring-ssh.desktop'
ExecStart=/usr/bin/bash -c 'systemctl --user set-environment \
SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)'
[Install]
WantedBy=default.target
En ExecStartPre
on désactive gnome-keyring-ssh
qui vient sinon en conflit avec l’agent GnuPG puis dans un second temps, on défini la variable d’environnement SSH_AUTH_SOCK
.
Enregistrer le fichier, recharger le démon systemd pour prendre en compte les modification et activer l’unit au démarrage et tout de suite :
systemctl --user daemon-reload
systemctl --user enable --now ssh-auth-sock.service
Pour terminer, on peut configurer l’agent pour utiliser pinentry-gnome3 pour avoir la popup de demande de saisie du code PIN de la carte à puce intégrée de façon harmonieuse dans GNOME.
Dans ~/.gnupg/gpg-agent.conf
, ajouter la ligne :
pinentry-program /usr/bin/pinentry-gnome3
On obtient une jolie boîte GTK3 pour nous demander de déverouiller la carte à puce :