gpg не удалось подписать данные фатально: не удалось записать объект коммита [Git 2.10.0]

319

Я следил за несколькими статьями по поводу привлекательных атрибутов Git 2.10 . Проходя через который обновил GIT до 2.10.0 и внес изменения в глобальный, в .gitconfigрезультате следующим образом -

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = abc.def@gmail.com
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

Но теперь, когда я пытаюсь подписать свои коммиты, используя

git commit -a -S -m "message"

Я вижу следующую ошибку -

Вам нужен пароль, чтобы разблокировать секретный ключ для

пользователь: "XYZ (с цифровой подписью)"

2048-битный ключ RSA, идентификатор AAAAAAAA, создан 2016-07-01

ошибка: gpg не смог подписать данные фатально: не удалось записать объект коммита

Примечание. Я все еще могу зафиксировать изменения, используяgit commit -a -m "message"

Есть ли способ преодолеть то же самое? Или какие-либо изменения, необходимые в gpgконфигах, чтобы ладить с обновлением git?


Обновление 1

Также ищите дополнительную полезность, следуя следующим указаниям. Есть ли способ «автоматического подписания» коммитов в Git с помощью ключа GPG? , Я уже настроил ключ, используя

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

и, очевидно, все равно получаю ту же ошибку.

Naman
источник
3
Я сталкиваюсь с подобной проблемой. Я удалил Git 2.8 (git-scm) в Windows. И установил 2.10. Теперь я получаю gpg failed to sign the dataкаждый раз, когда использую -S. В 2.8 я могу без проблем подписать коммит. Я не знаю, что случилось.
Иллюминатор
5
Добавление user.signingkeyисправило мою проблему, как ни странно.
Ксавье Хо
1
@nullpointer Я удалил оттуда свой ответ, потому что после глубокого осмотра я понял, что это дубликат!
Шаян Амани
1
По иронии судьбы, я изменил свой компьютер, чтобы все заново настроить, и в конечном итоге искал свой собственный вопрос, и ни одно из предложенных решений не выглядит достаточно чистым для меня, чтобы просто начать работу.
Наман
1
Для меня исправление было: git config user.nameбыл! = Имя, используемое при создании ключа PGP
stacksonstacks

Ответы:

464

Я столкнулся с этой проблемой с OSX.

Оригинальный ответ:

Похоже , что обновление GPG (от самогона) изменен на местоположение , gpgчтобы gpg1, вы можете изменить двоичный файл , где Git смотрит на GPG:

git config --global gpg.program gpg1

Если у вас нет gpg1: brew install gpg1.

Обновленный ответ:

Похоже, что gpg1 устарела / «аккуратно вытеснена из использования» , поэтому вам, вероятно, стоит обновить gpg2, к сожалению, это включает в себя еще несколько шагов / немного времени:

brew upgrade gnupg  # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

Первая часть устанавливает gpg2, а последняя требуется для ее использования . Для устранения неполадок посмотрите этот ответ (хотя это касается linux, а не brew), он предлагает хороший тест:

echo "test" | gpg --clearsign  # on linux it's gpg2 but brew stays as gpg

Если этот тест пройден успешно (нет ошибок / выводов, включая подпись PGP), вы успешно обновились до последней версии gpg.

Теперь вы сможете снова использовать git-подпись!
Стоит отметить, что вам нужно иметь:

git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true  # if you want to sign every commit

Примечание. После запуска подписанного коммита вы можете проверить, что он подписан с помощью:

git log --show-signature -1

который будет включать информацию gpg для последнего коммита.

Энди Хейден
источник
7
Установка gpg.program в / usr / local / bin / gpg (без «1») исправила это для меня.
Искыр
5
Кажется, обновление gnupg2с brewиспорченными символическими gpgссылками, таким образом, было удалено, я исправил ссылки, используя brew link --overwrite gnupg2.
Брайс
8
хм ... не работает. до сих пор выдает мою ошибку при входе в xcode.
Альберт Т. Вонг
1
@DrBeco не оригинальное местоположение / поведение? У меня все еще есть та же проблема с osx (я думаю, что я недавно обновил свой brew), gpg1это все еще экспортируемый исполняемый файл.
Энди Хейден
29
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentryнаконец исправил это для меня
Дэн Бешард
319

Если используются gnupg2 и gpg-agent 2.x, обязательно установите переменную окружения GPG_TTY.

export GPG_TTY=$(tty)

Смотрите документацию GPG об общих проблемах .

Koraktor
источник
18
Если вы используете рыбу, set -x GPG_TTY (tty)укажите свой профиль.
fasfsfgs
@StuartCardall Какой смысл команды chown? Обычно он уже был назначен вам системным процессом, когда вы вошли в систему или создали псевдо-tty. Если он принадлежит кому-то другому, а вы не root, он потерпит неудачу. Если группа - это что-то другое, это, вероятно, не имеет значения, и пользователи обычно не входят в группу tty.
пул
@poolie - это важно , если вам suна rootна удаленном сервере
Стюарт Cardall
6
Я добавил переменную, ~/.zshrcи теперь я могу делать коммиты, теперь, когда она правильно подключается к терминалу. Спасибо за вашу помощь!
Алекс Гуррола
Это также в инструкциях GitHub: help.github.com/articles/telling-git-about-your-gpg-key
bonh
198

Если ничего не получается, используйте, GIT_TRACE=1чтобы попытаться увидеть, что на самом деле делает git:

$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object

Теперь выполните неудачную команду вручную:

$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key

Оказывается, мой ключ истек, gitне виноват.

Бомбы
источник
34
Хороший совет для отладки. +1
VonC
4
Это на самом деле помогло мне решить мою собственную проблему, и это решение для каждого типа проблемы с этим сообщением о состоянии. +1
xHocquet
Спасибо за отладку. Срок действия моего ключа также истек.
Sgnl
2
Спасибо! Это привело меня к моей проблеме. Как ни странно мой местный .git/configбыл nameуказан в одном проекте , который не соответствует моей подписи электронной почты. Этого было достаточно, чтобы отвергнуть это.
Кросс
1
Ну, выполнение gpg -bsau <key>на моей машине ничего не выполняет. Предполагается, что это займет слишком много времени, чтобы выполнить? Или это означает, что ключ можно использовать? @ VonC какие-нибудь идеи?
Наман
82

Я СДЕЛАН это через этот короткий и легкий рецепт:

Автоматическая подпись коммитов в macOS (глобально и с разными IDE):

Получите ваш signingkeyв этом пути .

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg

Поместите в gpg.confфайл следующее (отредактируйте файл nano ~/.gnupg/gpg.confкомандой):

no-tty

Поместите в gpg-agent.confфайл следующее (отредактируйте файл nano ~/.gnupg/gpg-agent.confкомандой):

pinentry-program /usr/local/bin/pinentry-mac

Обновление :

Возможно, вам потребуется выполнить killall gpg-agentкоманду после редактирования файла конфигурации gpg.conf, согласно комментариям. Как говорит самоочевидная команда, эта команда завершит работу агента GPG (Gnu Privacy Guard).

Шаян Амани
источник
2
Вы также можете объяснить, что делают эти команды? Это поможет с пониманием.
Дроид
7
Я также должен был запустить killall gpg-agentпосле установки файлов конфигурации, тогда это работало!
Паскаль Людвиг
Откуда мы знаем, что можем доверять людям, стоящим за этим pinentry-mac? Я не говорю, что мы не можем, но организация GPGTools является резервной копией очень маленькой команды, и в репо есть только 5 участников против использования, brew install gnupgкоторое использует работу gnupg.org .
Sunknudsen
В случае, если это помогает другим, моя проблема заключалась в том, что у меня был неправильный локальный user.signingkeyнабор, который я не заметил ни в своей конфигурации исходного дерева, ни в моих глобальных настройках (потому что я не думал смотреть на локальную конфигурацию). Убедитесь, что оба local ( git config --local --get user.signingkey) и global ( git config --global --get user.signingkey) одинаковы или, что еще лучше, сбрасывают локальный, если он недействителен ( git config --local --unset user.signingkey)
Гленн 'devalias'
в OSX (10.13.06) выдает следующую ошибку: bash: pinentry-program: команда не найдена
cgl
60

Может помочь убить процесс, gpg-agentкоторый может застрять со старыми данными. Таким образом, новый gpg-agentначал бы попросить пароль.

MaximKostrikin
источник
2
Это сделало это для меня.
Даним
12
Используй gpg-agent --daemonдля запуска
FooBar
1
мне тоже пришлось перезапустить gpg-agent
GnrlBzik
8
Для того, чтобы убить процесс на MacOS:killall gpg-agent
incleaf
1
в Убунтуgpgconf --kill gpg-agent
Адам
38

Следуйте приведенному ниже URL-адресу, чтобы настроить подписанный коммит https://help.github.com/en/articles/telling-git-about-your-signing-key

если по-прежнему получать gpg не удалось подписать данные фатально: не удалось записать объект фиксации

это не проблема с Git, это с GPG, выполните следующие шаги

1.gpg --version

  1. echo "test" | gpg --clearsign

если это показывает:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
  1. затем используйте export GPG_TTY=$(tty)

4. затем снова попробуйте echo "test" | gpg --clearsign в котором получена подпись PGP.

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

6.apply git commit -S -m "commitMsz"

Jayesh
источник
1
это было решением для меня! Большое спасибо!
upInCloud
Отличный обзор того, как выяснить, если это проблема.
Филипп Синьоре
Это то, что сделал это для меня. Большое спасибо!
Аллан Гуватудде
export GPG_TTY=$(tty)был трюк. Добавил это в мой .zshrcфайл
Шейн Стиллвелл
22

Любой, кто сталкивается с этой проблемой на компьютерах MacOS , попробуйте это:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac (если нужно)
  4. gpg --full-generate-key Создайте ключ с помощью алгоритма.
  5. Получить сгенерированный ключ, выполнив: gpg --list-keys
  6. Установите ключ здесь git config --global user.signingkey <Key from your list>
  7. git config --global gpg.program /usr/local/bin/gpg
  8. git config --global commit.gpgsign true
  9. Если вы хотите экспортировать свой ключ в GitHub, то: gpg --armor --export <key> и добавьте этот ключ в GitHub в ключах GPG: https://github.com/settings/keys (с включенными строками START и END)

Если проблема все еще существует:

test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile

echo 'export GPG_TTY=$(tty)' >> ~/.profile

Если проблема все еще существует:

Установите https://gpgtools.org и подпишите ключ, который вы использовали, нажав Sign в строке меню: Key -> Sign

Если проблема все еще существует:

Перейти к: Ваш глобальный .gitconfigфайл , который в моем случае по адресу: /Users/gent/.gitconfig И изменить .gitconfig файл (пожалуйста , убедитесь , что e - mail и имя одинаковы с той , которую вы создали при генерации ключа) :

[user]
	email = gent@youremail.com
	name = Gent
	signingkey = <YOURKEY>
[gpg]
	program = /usr/local/bin/gpg
[commit]
	gpsign = true
	gpgsign = true
[filter "lfs"]
	process = git-lfs filter-process
	required = true
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
[credential]
	helper = osxkeychain

Гент Берани
источник
2
Добавление 'gpsign = true' в .gitconfig исправило это для меня
Пьер
18

Мои два цента здесь:

Когда вы создаете и добавляете ключ в gpg-agent, вы определяете что-то под названием passphrase. Теперь, когда passphraseв какой-то момент истекает, иgpg вам нужно ввести его снова, чтобы разблокировать ключ, чтобы вы могли снова начать подписывать.

Когда вы используете любую другую программу, которая взаимодействует с gpg, gpgподсказка для ввода вашей парольной фразы не появляется (в основном, gpg-agentкогда daemonized не может показать вам диалог ввода вstdin ).

Одно из решений - gpg --sign a_file.txtввести пароль, который вы ввели при создании ключа, и тогда все должно быть в порядке (gpg-agent должно автоматически подписываться).

Посмотрите этот ответ о том, как установить более длительные тайм-ауты для вашей парольной фразы, чтобы вам не приходилось делать это все время.

Или вы можете полностью удалить пароль с ssh-keygen -p

Изменить: Сделайте, man gpg-agentчтобы прочитать некоторые вещи о том, как сделать это автоматически, и добавить строки:

GPG_TTY=$(tty)
export GPG_TTY

на вашем .bashrc, если вы используете bash (это правильный ответ, но я придерживаюсь вышеизложенного)

Георгий Дарамоускас
источник
Спасибо @ george-daramouskas, это была моя проблема.
Ник Баркер
10

Обновление октябрь 2016: в выпуске 871 упоминалось «В Git 2.9.3 перестала работать подпись»

Git для Windows 2.10.1, выпущенный два дня назад (4 октября 2016 г.), исправил подпись Interactive GPG о коммитах и ​​тегах.

Недавнее изменение знака gpg в git (которое не создает проблем в Linux) выявляет проблему, связанную с тем, как в Windows не-MSYS2-git взаимодействует с MSYS2-gpg.


Оригинальный ответ:

Читая « 7.4 Git Tools - Подписание вашей работы », я предполагаю, что у вас есть « user.signingkey» набор конфигурации.

Последний большой рефакторинг (перед Git 2.10) вокруг gpg был в коммите 2f47eae2a , здесь это сообщение об ошибке было перемещено вgpg-interface.c

Журнал в этом файле показывает недавнее изменение в коммите af2b21e (Git 2.10)

gpg2 уже использует длинный формат по умолчанию, но в большинстве дистрибутивов, по-видимому, все еще используется «gpg» более старой версии 1.x из-за соображений совместимости. А старые версии gpg показывают только 32-битный короткий идентификатор, что небезопасно.

На самом деле это не имеет значения для самой проверки : если проверка прошла успешно, подпись pgp хороша.
Но если у вас еще нет ключа и вы хотите его получить, или вы хотите точно проверить, какой ключ использовался для проверки, и хотите его проверить, мы должны указать ключ с большей точностью.

Поэтому проверьте, как вы указали свою user.signingkeyконфигурацию и версию gpg, которую вы используете (gpg1 или gpg2), чтобы узнать, как они влияют на сообщение об ошибке.

Существует также коммит 0581b54, который изменяет условие для gpg failed to sign the dataсообщения об ошибке (в дополнение к коммиту 0d2b664 ):

Мы вообще не читаем из stderr. Тем не менее, мы хотим , чтобы в будущем патче, так что это также готовит нас там (и в этом случае GPG делает запись перед чтением всех входных данных, хотя , опять же , маловероятно , что ключ UID заполнит буфер трубы).

В коммите 4322353 показано, что gpg теперь использует временный файл, поэтому возможны проблемы с этим.

Давайте перейдем к использованию объекта временного файла, который обрабатывает сложные случаи для нас, и добавим отсутствующий вызов очистки.

VonC
источник
У меня есть мой user.signingkeyконфиг установлен. Также использую gpg (GnuPG) 2.0.3.
Наман,
@nullpointer Я отредактировал свой ответ. Можете ли вы проверить, сохраняется ли проблема с Gti For Windows 2.10.1.
VonC
извините за последнее обновление, работающий на MacOSX, а не на Windows, поэтому не смог проверить это.
Наман
10

Этот мерзавец был очень показателен для моей ситуации ...

   GIT_TRACE=1 git commit -m "a commit message"
   13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
   13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'full name <your-email@domain.com>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

Мне нужно было сгенерировать начальный ключ в соответствии с форматом, который gitпроверял. Лучше всего скопировать значение, переданное -bsauвыше, в журналах как есть и использовать ниже.

Так и становится,

   gpg --quick-generate-key "full name <your-email@domain.com>"

Тогда это сработало.

Надеюсь, это поможет.

phyatt
источник
Это сработало для меня и git traceбыло действительно полезно.
Филипп Огенеробо Балогун
1
приятель ... ты не можешь изобразить, сколько часов я потратил, пытаясь разобраться в этом, пока я не достиг твоего Ответа ... это было наименование ключа все время ... спасибо! Спасибо! Спасибо!
Джоманда
8

Используя cygwin, я недавно перешел на gpg2. Тогда у меня была такая же проблема для подписи с помощью git после установкиgit config gpg.program gpg2 .

Попробуйте echo "test" | gpg2 --clearsignпосмотреть, работает ли gpg2. Я нашел это самое простое решение, чтобы просто установить git config gpg.program gpg, потому что это работает. Но вы также получите лучшую ошибку - например, вам нужно установить pinentry.

lucidbrot
источник
На самом деле, в некоторых дистрибутивах Linux вы можете столкнуться с той же проблемой. Git всегда использует gpg, а не gpg2. Смотрите также: stackoverflow.com/questions/34766123/...
rugk
Это выявило для меня ошибку, gpg: signing failed: Inappropriate ioctl for deviceкоторую можно решить export GPG_TTY=$(tty). Источник: github.com/keybase/keybase-issues/issues/2798
swiknaba
8

На OS X, используя gnupg2via brew, мне просто нужно было убить gpg agent , иногда случается:

pkill -9 gpg-agent

И установите envпеременную, если необходимо:

export GPG_TTY=$(tty)

Смотрите также общие проблемы GPG и этот ответ здесь.

trainoasis
источник
2
Это сработало и для меня. Я создал новый псевдоним alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'.
Ольдерс
1
Это отлично работает, спасибо. После этого даже не нужно было устанавливать переменную env.
Ник Рамо
8

Я видел похожие ответы, но ничего похожего на то, что у меня сработало. В Linux мне пришлось убить и перезапустить мой gpg-agentс:

$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...

Это помогло мне. Похоже, вам нужно user.signingkeyустановить свой закрытый ключ, а также то, что говорят некоторые другие комментарии.

$ git config --global user.signingkey [your_key_hash]
Engineero
источник
6

Я получил эту ошибку в Ubuntu 18.04, и оказалось, что срок действия моего ключа истек .

Чтобы увидеть это, я запустил это и подтвердил, что срок действия моих ключей истек:

gpg --list-keys

Чтобы исправить это, я запустил (используя идентификатор, показанный в предыдущей команде):

gpg --edit-key <ID>

Оттуда я продлил срок действия key 0и key 1следовал этим инструкциям, которые сводились к тому, чтобы key 0потом набирать текст expireи следовать подсказкам. Потом повторяем за key 1.

Затем, чтобы проверить это, я побежал:

echo test | gpg --clearsign

И до исправления произошел сбой с ошибкой:

gpg: нет секретного ключа по умолчанию: нет секретного ключа
gpg: [stdin]: сбой при очистке: нет секретного ключа

Но после исправления та же команда успешно подписала сообщение, так что я знал, что все снова работает!

gMale
источник
Подтверждение этого исправило проблему при импорте действительного ключа из Mac OSX Catalina в CentOS7. Более двух часов сражался с этим зверем, пытаясь выяснить, почему он, помимо прочего, продолжал спрашивать пароль. Как ни странно, он уже был настроен так, что никогда не истекает, и я установил, что он никогда не истекает
Коди Б
5

Я столкнулся с той же проблемой. Я рад сообщить, что проблема не в, git 2.10.0а в gnupg 1.4.21.

Временное понижение версии gnupg до 1.4.20 исправило проблему для меня.

Если вы используете homebrew и обновили свои пакеты, как я, вы, вероятно, можете просто запустить, brew switch gnupg 1.4.20чтобы вернуться назад.

Arno
источник
3

Убедитесь, что ваш адрес электронной почты настроен правильно.

git config --global user.email "user@example.com"
Уэстон Рид
источник
1
Это единственное решение, которое сработало для меня, было полезно следовать правильному методу генерации ключа GPG через github
Наз
1
В моем случае проблема заключалась в том, что я использовал электронную почту компании в определенном репо, для которого у меня не было сгенерированного ключа PGP.
Рубик
3

Если электронное письмо, связанное с uid вашего ключа GPG, отличается от электронного письма, которое вы используете в git, вам нужно добавить еще один идентификатор пользователя в ваш ключ ИЛИ использовать ключ, который точно соответствует электронному письму.

Вы можете добавить другой UID, используя:

$ gpg --edit-key

См. Мо /superuser/293184/one-gnupg-pgp-key-pair-two-emails

JavaRocky
источник
1
Это было для меня. Боже, как же нет более информативного сообщения об ошибке, чем «не удалось подписать данные».
Alec
3

Я, должно быть, как-то случайно обновил gpg, потому что получил это после попытки проверить, работает ли gpg:

gpg: WARNING: server 'gpg-agent' is older than us (2.1.21 < 2.2.10)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.

Бег gpgconf --kill allисправил это для меня.

Надеюсь, это кому-нибудь поможет.

Visokoo
источник
2

У меня была похожая проблема с последними источниками Git (2.12.2), созданными вместе с последними источниками всех его зависимостей (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring и т. Д.).

Оказывается, libreadlineдавал GnuPG проблемы:

$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

И конечно, попытка получить полезную информацию с помощью Git -vvvне удалась, поэтому неудача была загадкой.

Чтобы устранить ошибку PGP из-за ReadLine, следуйте инструкциям в разделе Не удается обновить или использовать менеджер пакетов - ошибка gpg :

В терминале:

ls /usr/local/lib

там была куча библиотек readline (libreadline.so.BLAH-BLAH), поэтому я:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig
jww
источник
2

Ответы выше отличные, но у меня они не сработали. То, что решило мою проблему, было экспортировать как публичное, так и секретное ключей.

перечислите ключи с машины, с которой мы экспортируем

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <email@example.com>
sub 2048g/DEFABC01 2008-04-13

экспортировать ключи

$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

перейти к машине, которую мы импортируем и импортировать

$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg

Бинго Бонго, все готово!

ссылка: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

пс. Мои ключи изначально были сделаны в bootcamp windows 7, и я экспортировал их на свой Mac Air (один и тот же физический компьютер, фактически другой)

ASUS
источник
2

Я на Ubuntu 18.04 и получил ту же ошибку, беспокоился также в течение нескольких недель. Наконец понял, что gpg2 ни на что не указывает. Так просто беги

git config --global gpg.program gpg

И тада, это работает как шарм.

Подписанный коммит

Ваши коммиты теперь будут подтверждены тегом с ними.

Аашутош Рати
источник
2

Я наткнулся на эту ошибку не из-за проблем с конфигурацией, а потому, что срок действия моего ключа истек. Самый простой способ продлить срок его действия в OSX - открыть приложение GPG Keychain (если оно у вас установлено), и оно автоматически предложит вам его продлить. Два щелчка, и все готово. Надеюсь, это поможет коллегам по Googles :)

maxhm10
источник
2

Это начало происходить внезапно для меня в Ubuntu, не уверен, что какое-то недавнее обновление сделало это, но ни одна из существующих проблем не была применима для меня (я GPG_TTYустановил, попытался убить агента и т. Д.). Автономная gpgкоманда не выполнялась с этой ошибкой:

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

test
gpg: signing failed: Operation cancelled
gpg: [stdin]: clear-sign failed: Operation cancelled

Я попытался запустить gpgс --debug-allопцией и заметил следующий вывод:

gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
gpg: DBG: chan_3 -> END
gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
gpg: signing failed: Operation cancelled

Вышесказанное указывает на наличие проблем с pinentryпрограммой. Gpg, как правило, работает pinentry-cursesдля меня, поэтому я изменил его pinentry-tty( aptitude installсначала мне пришлось ), и ошибка исчезла (хотя я больше не получаю полноэкранный ввод пароля, но мне все равно это не нравится). Для того, чтобы сделать эти изменения, я должен добавить строку pinentry-program /usr/bin/pinentry-ttyв ~/.gnupg/gpg-agent.confи убить агент с gpgconf --kill gpg-agent(он перезапускается в следующий раз).

haridsv
источник
1

Ни один из приведенных выше ответов не соответствовал моей проблеме. Мой gpgбинарный файл ( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) был установлен как часть GPG Suite , а не как brew.

Тем не менее, я чувствовал, что совет сводился к следующему: «используйте тот gpgдвоичный файл, который является последним доступным на brew». Итак, я попробовал:

brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2

Я проверил, что я правильно изменил gpgна мой, $PATHчтобы указать на новый исполняемый файл от brew:

🍔 which gpg
/usr/local/bin/gpg
🍔 ls -l /usr/local/bin/gpg
lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

И я также явно сказал git, какой gpgдвоичный файл использовать:

git config --global gpg.program gpg

Ну, может быть, это не совсем водонепроницаемо, так как это чувствительно к пути. На самом деле я не зашёл так далеко, чтобы подтвердить без сомнения, что Git переключился на вызов вареваgpg .

В любом случае: ничего этого было недостаточно, чтобы git commitснова успешно подписать мои коммиты.


В конечном итоге у меня сработало обновление GPG Suite . Я запускал версию 2016.7 и обнаружил, что обновление до 2016.10 решило проблему для меня.

Я открыл GPG Keychain.appи нажал «Проверить наличие обновлений…». С новой версией: подписанные коммиты снова заработали правильно.

Birchlabs
источник
Я попытался обновить до последней версии ... это тоже не сработало. пытаюсь войти в xcode.
Альберт Т. Вонг
1

установил это просто:

brew uninstall gpg 

brew install gpg2
Анураг Парик
источник
1

Очень похоже на @birchlabs, после долгих поисков и поисков я обнаружил, что это не GPG, а GPG Suite. Я сделал, cask reinstall gpg-suiteи это решило это для меня.

Джон
источник
0

Если это произошло случайно и в прошлом работало идеально, как в моем случае, попробуйте выйти из системы ( cmd+shift+q) и снова войти в систему.

Скайлар Браун
источник
0

В моем случае ни одно из решений, упомянутых в другом ответе, не сработало. Я обнаружил, что проблема была характерна для одного хранилища. Удаление и клонирование репо снова решило проблему.

Дэвид Мигель
источник
0

Что-то странное, но убедитесь, что ваш терминал достаточно большой! Вы можете сказать, если он слишком маленький, запустив echo test | gpg --clearsign- он даст вам довольно очевидное сообщение об ошибке, сообщающее вам. Если он недостаточно велик, ваш агент GPG не сможет отобразить свой маленький блок ncurses.

Это не будет применяться, если вы используете агент с графическим интерфейсом или что-то, что не использует ncurses.

Фонд Моники Иск
источник