Contexto

Contexto

Contexto

Me gustaría utilizar subclaves de autenticación GPG en lugar de claves SSH.

También me gustaría utilizarlo gpg-agentpara 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-cursespara 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 tmuxsesiones y paneles, y necesito poder hacerlo git pushdesde cualquiera de ellos.

Problema

El problema ocurre cuando intento hacerlo. En lugar de pinentryaparecer 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-cursesaun 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

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 updatestartupttycada 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"

información relacionada