5

При использовании gpg-agent с git tag -u я сразу получаю следующую ошибку:

gpg: cancelled by user
gpg: skipped "my@email.com": 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

Когда я сначала разблокирую ключ (с помощью gpg -e -s test.txt), то команда git tag -u поднимает ключ и подписывает тег, как и ожидалось.

Это на Ubuntu 13.10, используя i3 wm. Я подозреваю, что gnome-keyring каким-то образом мешает ... что-то, но на Raspberry Pi, работающем с archlinux-arm, он работает точно так же, но с немного другой проблемой - После запуска команды git tag -u , он запрашивает пароль для разблокировки, но не отображается пинентри или приглашение. Через некоторое время (около 30 секунд) происходит сбой со следующим:

gpg: problem with the agent: Line passed to IPC too long
gpg: skipped "my@email.com": Operation cancelled
gpg: signing failed: Operation cancelled
error: gpg failed to sign the data
error: unable to sign the tag

Опять же, как только я разблокирую ключ с прямым gpg -s в произвольный файл для кэширования учетных данных в gpg-agent, тег подписывается без проблем.

Я предполагаю, что что-то странное с использованием моих проклятий. Я уже обновил /usr /bin /pinentry, чтобы он указывал на /usr /bin /pinentry-curses, но проблема сохраняется.

Что я делаю не так, и как мне заставить git хорошо играть с gpg/pinentry?

  • Ubuntu GPG версия: 1.4.14
  • archlinux-arm версия gpg: gnupg-2.0.22-1

РЕДАКТИРОВАТЬ: работает Zsh. Вот соответствующий бит, полученный для агента 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

когда я следую $(tty) (например: /dev/pts/16), владение уже является user:tty .

2 ответа2

4

Вам также необходимо будет экспортировать переменную GPG_TTY каждый раз, когда вы запускаете новый TTY (это также можно сделать из файлов bash/zsh rc):

export GPG_TTY=$(tty)
0

Проблемы с диалоговым окном Pinentry ncurses связаны с тем, кто пытается использовать пинентри TTY (если вы сначала входите в систему как пользователь, а затем, например, su).

Поместите следующий скрипт в /etc/profile.d/gpg-agent.sh, чтобы исправить это (вы можете пропустить внешний, if в многопользовательской системе или измените условие на!знак равно

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .