
Contexto
Gostaria de usar subchaves de autenticação GPG em vez de chaves SSH.
Eu também gostaria de usar gpg-agent
para gerenciar o cache de senhas para essas chaves.
Estou executando em um ambiente sem cabeça, então gostaria de usar pinentry-curses
meu programa de entrada de senha, mas estou bem com qualquer coisa que funcione em um ambiente sem cabeça.
Meu fluxo de trabalho de desenvolvimento é tal que estou trabalhando em várias tmux
sessões e painéis e preciso poder fazer isso git push
em qualquer um deles.
Problema
O problema ocorre quando tento fazer isso. Em vez de pinentry
aparecer no meu painel atual, ele aparece em outro painel aleatório (ou às vezes talvez em nenhum painel, mas é possível que haja muitos para pesquisar). Para resolver isso, preciso encerrar esse painel e pinentry-curses
, mesmo assim, às vezes ele ainda falha.
O que eu tentei
Configurações que tentei
Minha configuração atual é a seguinte, embora eu tenha tentado várias vezes nas últimas semanas para tentar fazer isso funcionar.
# ~/.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 que tentei
- pinentry gpg2 falha sem X
- Melhores práticas para agente SSH, tmux e GnuPG
- Pinentry falha com gpg-agent e 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
Atualização: configuração de trabalho (obrigado novamente 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"
Responder1
O problema é que você liga gpg-connect-agent updatestartuptty
toda vez que abre um terminal, então o pinentry aponta para o shell mais recente.
O que você realmente deseja não é o terminal shell mais recente, mas aquele a partir do qual você está se conectando (ao chamar ssh)
Para isso, a maneira mais fácil é dizer ao .ssh/config para executar o comando de atualização do tty que você está conectando. Esta é a linha mágica que está faltando:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"