
Kontext
Ich möchte GPG-Authentifizierungsunterschlüssel anstelle von SSH-Schlüsseln verwenden.
Ich möchte es auch verwenden, gpg-agent
um die Kennwortzwischenspeicherung für diese Schlüssel zu verwalten.
Ich arbeite in einer Headless-Umgebung und würde sie daher gerne pinentry-curses
für mein Programm zur Kennworteingabe verwenden, aber ich bin mit allem zufrieden, was in einer Headless-Umgebung funktioniert.
Mein Entwicklungsworkflow besteht darin, dass ich in mehreren Sitzungen und Bereichen arbeite und von jedem davon aus tmux
darauf zugreifen können muss .git push
Problem
Das Problem tritt auf, wenn ich dies versuche. Anstatt pinentry
in meinem aktuellen Fenster aufzutauchen, taucht es in einem zufälligen anderen Fenster auf (oder manchmal vielleicht in gar keinem Fenster, aber es ist möglich, dass es einfach zu viele sind, um sie zu durchsuchen). Um dies zu beheben, muss ich dieses Fenster schließen und pinentry-curses
selbst dann schlägt es manchmal immer noch fehl.
Was ich versucht habe
Von mir ausprobierte Konfigurationen
Meine aktuelle Konfiguration ist wie folgt, obwohl ich in den letzten Wochen eine Menge ausprobiert habe, um sie zum Laufen zu bringen.
# ~/.zshrc
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
if [[ $SSH_AUTH_SOCK == /tmp/* ]]; then
ln -sf $SSH_AUTH_SOCK $HOME/.ssh-agent-sock
export SSH_AUTH_SOCK=$HOME/.ssh-agent-sock
fi
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Links, die ich ausprobiert habe
- gpg2 pinentry schlägt ohne X fehl
- Best Practices für SSH, tmux und GnuPG Agent
- Pinentry schlägt mit GPG-Agent und SSH fehl
- https://wiki.archlinux.org/index.php/GnuPG#SSH_agent
- https://gist.github.com/andrewlkho/7373190
- https://www.linode.com/docs/security/authentication/gpg-key-for-ssh-authentication/
- https://opensource.com/article/19/4/gpg-subkeys-ssh
Update: Funktionierende Konfiguration (nochmals vielen Dank an @SystematicFrank)
# ~/.zshrc
export GPG_TTY=$(tty)
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Antwort1
Das Problem besteht darin, dass Sie jedes Mal aufrufen, wenn gpg-connect-agent updatestartuptty
Sie ein Terminal öffnen, sodass Pinentry selbst auf die neueste Shell verweist.
Was Sie eigentlich wollen, ist nicht das neueste Shell-Terminal, sondern das, von dem aus Sie sich verbinden (beim Aufruf von SSH).
Der einfachste Weg hierfür ist, .ssh/config anzuweisen, den Update-Befehl von dem TTY aus auszuführen, mit dem Sie sich verbinden. Dies ist die magische Zeile, die Ihnen fehlt:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"