
Contexto
Me gustaría utilizar subclaves de autenticación GPG en lugar de claves SSH.
También me gustaría utilizarlo gpg-agent
para administrar el almacenamiento en caché de contraseñas para estas claves.
Estoy ejecutando en un entorno sin cabeza, por lo que me gustaría utilizarlo pinentry-curses
para mi programa de ingreso de contraseña, pero estoy bien con cualquier cosa que funcione en un entorno sin cabeza.
Mi flujo de trabajo de desarrollo es tal que trabajo en varias tmux
sesiones y paneles, y necesito poder hacerlo git push
desde cualquiera de ellos.
Problema
El problema ocurre cuando intento hacerlo. En lugar de pinentry
aparecer en mi panel actual, aparece en otro panel aleatorio (o a veces quizás en ningún panel, pero es posible que haya demasiados para buscar). Para resolver esto, necesito cerrar ese panel y pinentry-curses
aun así falla a veces.
Lo que he probado
Configuraciones que he probado
Mi configuración actual es la siguiente, aunque lo he intentado muchas veces durante las últimas dos semanas para intentar que esto funcione.
# ~/.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
Enlaces que he probado
- gpg2 pinentry falla sin X
- Mejores prácticas para SSH, tmux y agente GnuPG
- Pinentry falla con gpg-agent y SSH
- 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
Actualización: Configuración de trabajo (gracias de nuevo a @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"
Respuesta1
El problema es que estás llamando gpg-connect-agent updatestartuptty
cada vez que abres una terminal, por lo que pinentry apunta al último shell.
Lo que realmente desea no es el terminal de shell más reciente, sino aquel desde el que se está conectando (cuando llama a ssh)
Para eso, la forma más sencilla es decirle a .ssh/config que ejecute el comando de actualización desde el tty al que se está conectando. Esta es la línea mágica que te falta:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"