Install
Prerequisites
Consider redundancy
If you lose access to your hardware security device (for example if it is lost, stolen, or broken) there is no way to recover the keys stored on it. For that reason it is highly recommended that you use fallback SSH or GPG keyfiles and/or multiple hardware security devices.
Install pcsclite
piv-agent has transitive dependencies through piv-go, on pcsclite.
# debian / ubuntu
sudo apt install libpcsclite1
# TODO: other platforms
...
Install piv-agent
Download the latest release, and extract it to a temporary location.
Linux
Copy the piv-agent binary into your $PATH, and the systemd unit files to the correct location:
sudo cp piv-agent /usr/local/bin/
cp deploy/systemd/piv-agent.{socket,service} ~/.config/systemd/user/
systemctl --user daemon-reload
macOS
piv-agent requires Homebrew in order to install dependencies.
So install that first.
Copy the piv-agent binary into your $PATH, and the launchd .plist files to the correct location:
sudo cp piv-agent /usr/local/bin/
cp deploy/launchd/com.github.smlx.piv-agent.plist ~/Library/LaunchAgents/
From what I can tell .plist files only support absolute file paths, even for user agents.
So edit ~/Library/LaunchAgents/com.github.smlx.piv-agent.plist and update the path to $HOME/.gnupg/S.gpg-agent.
If you plan to use gpg, install it via brew install gnupg.
If not, you still need a pinentry, so brew install pinentry.
If ~/.gnupg doesn’t already exist, create it.
mkdir ~/.gnupg
chmod 700 ~/.gnupg
Then enable the service:
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/com.github.smlx.piv-agent.plist
launchctl enable gui/$UID/com.github.smlx.piv-agent
A socket should appear in ~/.gnupg/S.gpg-agent.
Disable ssh-agent to avoid SSH_AUTH_SOCK environment variable conflict.
launchctl disable gui/$UID/com.openssh.ssh-agent
Set launchd user path to include /usr/local/bin/ for pinentry.
sudo launchctl config user path $PATH
Reboot and log back in.
Socket activation
piv-agent relies on socket activation, and is currently tested with systemd on Linux, and launchd on macOS.
It doesn’t listen to any sockets directly, and instead requires the init system to pass file descriptors to the piv-agent process after it is running.
This requirement makes it possible to exit the process when not in use.
ssh-agent and gpg-agent functionality are enabled by default in the systemd and launchd configuration files.
On Linux, the index of the sockets listed in piv-agent.socket are indicated by the arguments to --agent-types.