Utiliser l’agent GnuPG pour l’authentification SSH avec des application graphiques (sous GNOME avec systemd)

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 :

Demande de saisie du code PIN pour déverrouiller la carte à puce avec pinentry-gnome3

A propos Jean Traullé

Passionné par l'informatique et les nouvelles technos, miagiste, papa de opencomp.fr, #sysadm, #ProxmoxVE, #Docker, #TYPO3, #CakePHP enthousiaste 😊
Ce contenu a été publié dans Non classé, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *