git tag com gpg-agent e pinentry-curses

5

Ao usar gpg-agent com git tag -u, estou recebendo 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 destravo a chave primeiro (através de gpg -e -s test.txt ), o comando git tag -u pega a chave e assina a tag como esperado.

Isso está no Ubuntu 13.10, usando o i3 wm. Eu suspeitaria que o gnome-keyring esteja de alguma forma atrapalhando ... alguma coisa, mas em um pi de framboesa, rodando o archlinux-arm, ele funciona da mesma maneira, mas com um problema ligeiramente diferente - Depois de executar o comando git tag -u , ele pede uma senha para desbloquear, mas não aparece nenhum pinagem ou prompt. 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

Mais uma vez, quando eu desbloquear a chave com um gpg -s direto para um arquivo arbitrário para armazenar as credenciais em cache no gpg-agent, a tag será assinada sem problemas.

Minha suposição é que algo é estranho com o meu uso de curses de pinagem. 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 brincar com gpg / pinentry?

  • ubuntu versão gpg: 1.4.14
  • versão gpg do archlinux-arm: gnupg-2.0.22-1

EDIT: executando zsh. Aqui está o bit relevante fornecido pelo 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 eu sigo $ (tty) (por exemplo: /dev/pts/16 ) a propriedade já é user:tty .

    
por Jeff Wong 21.12.2013 / 01:04

2 respostas

4

Você também precisará exportar a variável GPG_TTY sempre que iniciar um novo TTY (também pode ser feito a partir de arquivos bash / zsh rc):

export GPG_TTY=$(tty)
    
por 18.08.2014 / 18:54
0

Problemas com a caixa de diálogo ncurses do Pinentry estão relacionados à propriedade da tentativa de pinagem do TTY (se você inicialmente logar como usuário & depois su por exemplo).

Coloque o seguinte script em /etc/profile.d/gpg-agent.sh para corrigi-lo (talvez você queira omitir o if externo em um sistema com vários usuários 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
    
por 18.04.2014 / 08:44

Tags