
Ao usar o gpg-agent com git tag -u, recebo o seguinte erro imediatamente:
gpg: cancelled by user
gpg: skipped "[email protected]": bad passphrase
gpg: signing failed: bad passphrase
error: gpg failed to sign the data
error: unable to sign the tag
gpg-agent.conf:
pinentry-program /usr/bin/pinentry-curses
Quando eu desbloqueio a chave primeiro (por meio de a gpg -e -s test.txt
), o git tag -u
comando pega a chave e assina a tag conforme o esperado.
Isso está no Ubuntu 13.10, usando i3 wm. Eu suspeitaria que o gnome-keyring esteja de alguma forma dificultando... alguma coisa, mas em um raspberry pi, executando o archlinux-arm, ele funciona da mesma maneira, mas com um problema um pouco diferente - depois de executar o git tag -u
comando, ele pede uma senha para desbloquear, mas nenhuma entrada ou prompt aparece. Depois de um tempo (cerca de 30 segundos), ele falha com o seguinte:
gpg: problem with the agent: Line passed to IPC too long
gpg: skipped "[email protected]": Operation cancelled
gpg: signing failed: Operation cancelled
error: gpg failed to sign the data
error: unable to sign the tag
Novamente, depois de desbloquear a chave diretamente gpg -s
para um arquivo arbitrário para armazenar em cache as credenciais no gpg-agent, a tag é assinada sem problemas.
Minha suposição é que algo está estranho com meu uso de maldições de pinentry. Já atualizei /usr/bin/pinentry para apontar para /usr/bin/pinentry-curses, mas o problema persiste.
O que estou fazendo de errado e como faço para que o git funcione bem com o gpg/pinentry?
- versão gpg do Ubuntu: 1.4.14
- versão gpg do archlinux-arm: gnupg-2.0.22-1
EDITAR: executando zsh. Aqui está o bit relevante fornecido para o agente gpg:
if [ $EUID -ne 0 ] ; then
envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
eval "$(cat "$envfile")"
else
eval "$(gpg-agent --daemon --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO # the env file does not contain the export statement
fi
quando sigo $(tty) (por exemplo: /dev/pts/16
) a propriedade já é user:tty
.
Responder1
Você também precisará exportar oGPG_TTYvariável toda vez que você inicia um novo TTY (também pode ser feito a partir de arquivos bash/zsh rc):
export GPG_TTY=$(tty)
Responder2
Os problemas com a caixa de diálogo Pinentry ncurses estão relacionados à propriedade do TTY que o pinentry tenta usar (se você fizer login inicialmente como usuário e depois su, por exemplo).
Coloque o seguinte script em/etc/profile.d/gpg-agent.shpara corrigi-lo (você pode omitir o exterior if
em um sistema multiusuário ou alterar a condição para !=):
if [ "$(id -un)" = "root" ] ; then
envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
eval "$(cat "$envfile")"
else
eval "$(gpg-agent --daemon --enable-ssh-support --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO # the env file does not contain the export statement
export SSH_AUTH_SOCK # enable gpg-agent for ssh
GPG_TTY=$(tty)
chown $USER:tty $GPG_TTY # make pinentry-ncurses work
fi