SSH with gpg-agent on systemd

There’s a lot of information floating around on the web explaining how to replace ssh-agent with gpg-agent. This is important if you – like me – want to use a yubikey or smart card device to store the private key of your SSH key pair.

Unfortunately, n…


This content originally appeared on DEV Community and was authored by Erik Huelsmann

There's a lot of information floating around on the web explaining how to replace ssh-agent with gpg-agent. This is important if you - like me - want to use a yubikey or smart card device to store the private key of your SSH key pair.

Unfortunately, none of the advice worked for me with the following system setup:

  • systemd v249
  • GNOME desktop 42.9
  • Ubuntu 22.04

Although the above is quite specific, I expect the information below to much more generally applicable.

Prerequisite for Yubikeys and smart cards

GPG needs pcscd and scdaemon to be able to access private keys stored on a yubikey or smart card:

$ sudo apt install pcscd scdaemon
$ systemctl enable --now pcscd
$ systemctl enable --now scdaemon

After running these commands, gpg --card-status should provide you with information about your smart card.

Configuring GPG with ssh-agent support

To enable ssh-agent support in gpg-agent, add the following to your gpg-agent.conf:

# ~/.gnupg/gpg-agent.conf
enable-ssh-support

Enabling gpg-agent (per user)

gpg-agent is a per-user service, which systemd facilitates with the --user flag on the systemctl command:

$ systemctl enable --user --now gpg-agent.socket
$ systemctl enable --user --now gpg-agent-ssh.socket

If you forget to add the .socket extension, systemctl will throw an error about a missing [Install] section in the service definition. Please note that the sockets are to be enabled; the service itself is to be left untouched.

Verifying status of the GPG agent can be done using:

$ systemctl status --user gpg-agent.socket
$ systemctl status --user gpg-agent-ssh.socket

Although the service is now running, the environment shows an incorrect value for SSH_AUTH_SOCK ().

Fixing SSH_AUTH_SOCK

There are several configurations blocking successful use of gpg-agent for SSH, causing the value of SSH_AUTH_SOCK to be incorrect.

Disable ssh-agent user service

If it is enabled, this service needs to be disabled, as it is conflicting:

$ systemctl disable --user --now ssh-agent

Disable Xsession.options ssh-agent

The Xsession script tries to start an ssh-agent. This can be disabled by modifying /etc/X11/Xsession.options and /etc/X11/Xsession.options.d/*.conf, making sure the last file loaded contains:

no-use-ssh-agent

This is best achieved by creating a file named /etc/X11/Xsession.options.d/zz-no-ssh-agent.conf with that content.

Disable GNOME Keyring (gnome-keyring-ssh.desktop)

GNOME Keyring tries to start an SSH agent if none is running. The way to disable this is by executing the following commands - which are different from those published all around:

$ cp /etc/xdg/autostart/gnome-keyring-ssh.desktop ~/.config/autostart/gnome-keyring-ssh.desktop
$ echo "X-GNOME-Autostart-enabled=false" >> ~/.config/autostart/gnome-keyring-ssh.desktop
$ echo "Hidden=true" >> ~/.config/autostart/gnome-keyring-ssh.desktop

The "Hidden=true" addition is advertized all around the web, but didn't work for me.

Setting SSH_AUTH_SOCK

Using systemd to manage gpg-agent has one drawback: systemd doesn't set environment variables in the user shell session. This can be solved by adding this snippet to the user's bashrc:

# to be appended to ~/.bashrc
if [[ -z "$SSH_AUTH_SOCK" ]]
then
  if [[ -e "/run/user/$(id -u)/gnupg/S.gpg-agent.ssh" ]]
  then
    export SSH_AUTH_SOCK="/run/user/$(id -u)/gnupg/S.gpg-agent.ssh"
  fi
fi

Conclusion

Yubikey and smart card support with private keys on the key or card does not come out of the box, even in this day and age, but with a bit of configuration, setting up private keys on a smart card and making it work under GNOME, is doable.


This content originally appeared on DEV Community and was authored by Erik Huelsmann


Print Share Comment Cite Upload Translate Updates
APA

Erik Huelsmann | Sciencx (2024-07-12T19:43:05+00:00) SSH with gpg-agent on systemd. Retrieved from https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/

MLA
" » SSH with gpg-agent on systemd." Erik Huelsmann | Sciencx - Friday July 12, 2024, https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/
HARVARD
Erik Huelsmann | Sciencx Friday July 12, 2024 » SSH with gpg-agent on systemd., viewed ,<https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/>
VANCOUVER
Erik Huelsmann | Sciencx - » SSH with gpg-agent on systemd. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/
CHICAGO
" » SSH with gpg-agent on systemd." Erik Huelsmann | Sciencx - Accessed . https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/
IEEE
" » SSH with gpg-agent on systemd." Erik Huelsmann | Sciencx [Online]. Available: https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/. [Accessed: ]
rf:citation
» SSH with gpg-agent on systemd | Erik Huelsmann | Sciencx | https://www.scien.cx/2024/07/12/ssh-with-gpg-agent-on-systemd/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.