Ошибка Git - gpg не удалось подписать данные


169

Я только начал использовать git и установил git и gpg через homebrew. По какой-то причине я получаю эту ошибку, когда git commit смотрю на так много других вопросов о stackoverflow по этой теме, и ни один из них не помог мне. Как мне исправить эту ошибку, чтобы я мог успешно загрузить.

error: gpg failed to sign the data
fatal: failed to write commit object

3
Для пользователей Mac. У меня была эта проблема. Совет на этой странице помог мне понять, что у меня могут быть установлены две версии gpg, и я это сделал. Один из пивоварни и один из GPG Suite. Я хотел использовать пакет GPG Suite, так как он позволяет кэшировать парольную фразу в системной связке ключей. Удаление версии brew решило мои проблемы. Вместе с ответом @ sideshowbarker об убийстве gpg-agent. Поэтому я предполагаю, что конфигурации каждого из них мешали друг другу.
Майкл Велч


Возможный дубликат stackoverflow.com/questions/41502146/…
DrBeco

Я только что столкнулся с проблемой с подписью gpg, проблема заключалась в том, что в моем репозитории git не было установленного локального gpg.signingkey, но было установлено глобальное. Так что просто установите git config --local user.signingkeyправильный ключ, и он снова будет автоматически подписан. и, возможно, отключит глобальную с помощьюgit config --global --unset user.signingkey
MarcusJ

Ответы:


234

Для устранения неполадок сначала попробуйте две вещи:

  • запустить git config --global gpg.program gpg2, чтобы убедиться, что git использует, gpg2а неgpg
  • запустить echo "test" | gpg2 --clearsign, чтобы убедиться, что gpg2сам работает

Если все в порядке, можно попробовать следующее:

  • запустить, brew install pinentryчтобы убедиться, что у вас установлен хороший инструмент для ввода парольной фразы

Если после этой установки вы повторите попытку git commitи все равно получите failed to sign the dataошибку " ":

  • запустить, gpgconf --kill gpg-agentчтобы убить любого работающего агента, который может зависнуть

Если это говорит о том, что gpgconfон не установлен или не имеет --killопции, вы можете попробовать следующее:

  1. cp ~/.gnupg ~/.gnupg-GOODчтобы сохранить копию, ~/.gnupgчтобы вернуться к ней позже при необходимости
  2. brew install gnupg21 для установки GnuPG 2.1

Причина сохранения копии вашего ~/.gnupgкаталога заключается в том, что GnuPG 2.1 потенциально создает / изменяет некоторые ключевые данные способом, который не имеет обратной совместимости с GnuPG 2.0 и более ранними версиями, поэтому, если вы хотите вернуться позже, вы можете это сделать mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


В противном случае необходимо выполнить несколько основных шагов, чтобы убедиться, что у вас есть рабочая среда GnuPG:

  • запустить gpg2 -K --keyid-format SHORT, чтобы убедиться, что у вас есть хотя бы одна пара ключей

Если вывод показывает, что у вас нет секретного ключа для использования GnuPG, вам необходимо его создать:

  • run gpg2 --gen-key, чтобы GnuPG провел вас через шаги по созданию пары ключей

Если вы получили сообщение об ошибке «Несоответствующий ioctl для устройства» , сделайте следующее:

  • запустить export GPG_TTY=$(tty)и / или добавить это в свой ~/.bashrcили˜/.bash_profile

Я получаю эту ошибку, когда запускаю вторую команду: gpg: no default secret key: no secret key gpg: [stdin]: clearsign failed: no secret key
Entitize

@Entitize Это похоже на то, что gpg не думает, что у вас есть ключи для подписи. См. Дополнительные шаги, которые я добавил к ответу; Если вы никогда раньше не бегали gpg2 --gen-key, это то, что вам нужно сделать в первую очередь.
sideshowbarker

2
когда я запускаю эхо "тест" | gpg2 --clearsign, он дает мне: gpg-agent [-]: команда get_passphrase не удалась: неподходящий ioctl для устройства gpg: проблема с агентом: неподходящий ioctl для устройства gpg: нет секретного ключа по умолчанию: операция отменена gpg: [stdin]: clearsign failed: операция отменена. Я пробовал так много других возможностей, но ни одна из них не работает. Есть ли способ использовать GIT без GPG!
Entitize

11
Вы можете попробовать export GPG_TTY=$(tty). Что касается использования git без gpg, вы должны иметь возможность сделать это по умолчанию или просто запустив git config --global commit.gpgsign falseглобальную отмену подписи gpg для ваших коммитов.
sideshowbarker

12
Здесь, в Mac OS X, я начал отлаживать echo "test" | gpg2 --clearsign, обнаружил ошибку, и это привело меня к этой теме , которая решила мою проблему: я просто поместил export GPG_TTY=$(tty)в свой ˜/.bash_profileфайл, а затем перезагрузилsource ˜/.bash_profile
herrera

81

Git необходимо знать, с каким ключом он подписывается.

После настройки GPG, gpg-agent и файлов gpg.conf (см. Это руководство ) вам необходимо запустить

git config --global user.signingkey EB11C755

Очевидно, замените открытый ключ в конце своим собственным. Если вы хотите, чтобы каждая фиксация была подписана по умолчанию, используйте

git config --global commit.gpgsign true

7
Я просто столкнулся с этим на случай, если кто-то еще был достаточно глуп, чтобы сделать то, что сделал я: убедитесь, что вы написали это «подписывающий ключ», а не «подпись».
ZNK

1
буквально этот комментарий @ZNK сделал это за меня. Я написал "signkey" вместо "signedkey"
jzatt

1
В принятом ответе это должно указываться как первый шаг по устранению неполадок, потому что иногда у вас уже есть все ключи, он просто git забывает, какой ключ использовать.
f055

49

Каким-то образом ваш git настроен на то, чтобы GPG подписывал каждую фиксацию. Для фиксации или отправки с помощью git не требуется подписывать GPG. Вероятно, это вызывает ошибку, потому что ваш механизм подписи gpg еще не настроен.

Если вы новичок в git, попробуйте сначала заставить его работать без подписи GPG, а затем добавьте подписку позже, если она вам действительно нужна.

Вы можете проверить, как ваш git настроен относительно gpg, выполнив:

git config -l | grep gpg

Что может дать ноль или более строк, в том числе:

commit.gpgsign=true

Если "commit.gpgsign" - истина, значит, у вас включена подпись gpg. Отключите его:

git config --global --unset commit.gpgsign

Затем попробуйте снова запустить коммит. Теперь он должен работать без подписи gpg. После того, как вы получите базовую работу git, попробуйте снова добавить подпись gpg в микс.


14
Потрясающие! git config --global --unset commit.gpgsignу меня сработало :)
hpaknia 09

Вау!! у меня это сработало: git config --global --unset commit.gpgsign
Hardy Mathew

39

Обратитесь к решениям @sideshowbarker и @Xavier Ho, я решил свою проблему, выполнив следующие действия.

Предположим, что gpg2 установлен brew,

git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key

gpg2 -K --keyid-format SHORT 

           

... /. gnupg / pubring.gpg

sec rsa2048 / 0A61C6FC 29.06.2017 [SC] [истекает: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Напомнил мой коллега, нужно добавить

export GPG_TTY=$(tty)

в ~ / .zshrc при использовании zsh, иначе добавить в ~ / .bash_profile


Для macOS:

gpg2 объединяется с gpg в brew, и поэтому команда gpg указывает на gpg2

brew install gpg2

информация о пиве gpg

gnupg: стабильный 2.2.6 (в бутылках)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

и есть pinentry-mac для ввода парольной фразы

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf

Добавить строку

Программа pinentry / USR / местные / bin / pinentry-mac

Напомнил мой коллега, нужно добавить

export GPG_TTY=$(tty)

в ~ / .zshrc при использовании zsh, иначе добавить в ~ / .bash_profile


2
macOS 10.15 (Catalina) поставляется с GnuPG версии 2.2.17, поэтому нет необходимости устанавливать его отдельно, если вы не планируете самостоятельно управлять обновлениями.
Джош Хабдас

Для пользователей macOS: можно создать файл ~ / .gnupg / gpg-agent.conf, если он не существует.
Жереми Буле,

25

Я им пользуюсь. Он поддерживает zsha и работает в подсистеме Windows для Linux:

export GPG_TTY=$(tty)

4
Я использую zsh в MacOS Catalina, и это единственное изменение, которое мне нужно, чтобы заставить его работать. Спасибо.
JP Lew

Я получал ошибку в OP после копирования моих ключей в мою среду WSL, оказывается, мне нужно было сделать это, чтобы предоставить подсказку для парольной фразы для ключа. Спасибо.
Нарвич

это также было решение для Ubuntu через SSH
lightswitch05

14

Убедитесь, что срок действия вашего ключа истек. Как только вы установите дату истечения срока действия (нет необходимости создавать новый ключ, если вы этого не хотите), он gitбудет работать как обычно.

Один из способов исправить просроченный ключ:

(Примечание: $представляет приглашение командной строки, вводите команды после приглашения; нажимайте Enter после каждой команды)

$ gpg2 --list-keysнайти соответствующий идентификатор ключа (символы после \в pubстроке)

$ gpg2 --edit-key <key id> - это открывает оболочку gpg с изменением подсказки на gpg>

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

Затем, если есть подключи, срок действия которых истек ( subотображается в строке), также сбросьте их даты истечения срока действия:

gpg> key 1- выбирает первый подключ gpg> expire- следуйте инструкциям, чтобы установить новую дату истечения срока действия для подключей

При необходимости повторите для каждого последующего подраздела.


У меня возникала эта проблема каждый раз, когда я пытался запустить ключ gpg, срок действия которого не истек. По какой-то причине git это не нравится. Использование этого метода для добавления срока годности (независимо от того, как далеко в будущем), похоже, решает проблему.
some_guy632

3
Не забудьте ввести saveв командной строке gpg, когда закончите!
daviewales

5

Это сработало для меня на ubuntu 18.04

Проверьте свой ключ gpg

gpg -K --keyid-format LONG

если вы получите пустой ответ, сгенерируйте ключ GPG

gpg --generate-key

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

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

установить git пение ключ

git config --global user.singingkey 95A854E0593B3214

тогда вам хорошо идти! (--global необязательно)

В качестве альтернативы, если вы не против подписаться с помощью ключа ssh

git config commit.gpgsign false

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


«В качестве альтернативы, если вы не против подписаться с помощью ключа ssh», какое отношение ssh имеет к подписи?
сволочи

SSH не имеет ничего общего с подписанием коммитов. Они имеют в виду отключение подписи коммитов GPG и в зависимости от использования ключей SSH для аутентификации, когда вы фактически отправляете свои коммиты на сервер git. Вы можете нажать (и это довольно часто), чтобы отправить беззнаковые коммиты с использованием аутентификации SSH.
phouse512

5

Пришлось исправить gpg.program на абсолютный путь к gpg:

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

Я использую Windows с cygwin.


3
Это было для меня решением. Я установил gnupg, используя шоколадный.
Alex S

Спасибо, у меня тоже сработало. Я сделалchoco install gpg4win
Gokul NC

4

Решение:

Issue: Disabled loopback pinentry mode

Чтобы решить эту проблему, вам нужно включить режим pinentry loopback в ~ / .gnupg / gpg.conf :

cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent 
pinentry-mode loopback

EOF

А также в ~ / .gnupg / gpg-agent.conf (создайте файл, если он еще не существует):

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

Затем перезапустите агент, echo RELOADAGENT | gpg-connect-agentи все будет в порядке!

Источник


1
Вау, после того, как я потратил часы на попытки всех возможных решений, моя проблема была решена, спасибо!
Мэтт

Пожалуйста. Собственно, спасибо источнику. Я тоже застрял в этом.
Рахул Такур,

3

Эта ошибка также может возникнуть, когда срок действия вашего ключа GPG истек. Создание нового ключа и добавление его в Git должно решить эту проблему.


3

У меня возникла эта проблема после обновления до gnupg 2.x. Было бы видно, что gpg2 ссылается на ключи по-другому: у меня все еще была signingkey = ABC98F11(настройка gpg v1) в моем ~/.gitconfig. Ключевые идентификаторы для gpg2 длиннее. Посмотрите их сgpg --list-secret-keys


2

Если у вас раньше были настроены pinentry и gpg, и они перестали работать из ниоткуда:

Проверьте, работает ли ваш gpg:

echo "test" | gpg --clearsign

Если он говорит gpg: signing failed: No pinentry, просто перезапустите клиент демона gpg, который время от времени зависает:

gpgconf --kill gpg-agent

Теперь должно работать:

echo "test" | gpg --clearsign

1

Я сделал gitключ с 3 отдельными ключами для certify/ sign/, encryptи в будущем срок действия ключа был истек (после работы в течение нескольких дней):

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

сделал новый ключ без добавления отдельных подключей для решения проблемы.


1

Для меня эта ошибка начала возникать git tag -sв Debian GNU / Linux, когда я переключился с pinentry-gnome3на pinentry-curses(использование update-alternatives --config pinentry) для упрощения удаленного доступа. Это произошло только с самим собой git tag -s, а не gpg(например gpg --clearsign) с ним.

Единственное изменение, необходимое для того, чтобы он снова заработал в этом случае, заключался в добавлении export GPG_TTY=$(tty)в мои файлы запуска оболочки.

Однако я не получил сообщение об ошибке «Несоответствующий ioctl для устройства», упомянутое в качестве индикатора этого исправления в другом ответе на этот вопрос.

Примечание.Поскольку причина получения этой ошибки была совершенно иной, чем у тех, кто предлагал export GPG_TTY=$(tty)ранее (обычно в качестве побочной подсказки) в других ответах на этот вопрос, я решил, что для этого вопроса нужен другой ответ, в котором упоминается, что это export GPG_TTY=$(tty)может быть основным исправлением и единственная вещь необходимая в некоторых случаях.


Благодарность! update-alternatives --config pinentryсделал это для меня. Я подключился по SSH к моему рабочему столу и pinentryбыл установлен на /usr/bin/pinentry-gnome3(который должен иметь резервный TTY при подключении по SSH или при переключении на виртуальную консоль). Но, видимо, это не сработало. Установка значения по умолчанию /usr/bin/pinentry-ttyна меня сделала свое дело. Возможно, мне придется вернуть его, когда я вернусь к своему рабочему столу, но пока я в порядке. export GPG_TTY=$(tty)было недостаточно. Я сделал это, но мне нужно было переключиться, pinentryпрежде чем я смог подписать свой коммит.
Карл Уилбур

1

Для меня это решило то, что имя ключа соответствовало моему имени пользователя git. Я предполагаю, что электронные письма тоже должны совпадать. Возможно, это связано с тем, что я использую GPG KeyChain на моем Mac. Не уверена.

Я думал, что называю ключ, когда заполнял это, но я предполагаю, что он запрашивал мое имя (имя пользователя git).

Форма брелка GPG


Жалко, что этот ответ так далеко позади, что многие не будут искать здесь свою проблему.
MaciekS

1

У меня была эта ошибка на macos - чтобы попытаться устранить неполадки, я попытался перечислить ключи, чтобы узнать, истек ли срок их использования gpg2 --list-keys- я подтвердил, что срок действия ключей не истек и что правильный ключ был установлен в моей конфигурации с использованием git config --global user.signingkey.

После того, как я выполнил эти команды, я внезапно снова смог без проблем выполнять подписанные коммиты. Я не менял свои файлы конфигурации или ключи - я даже не создавал новый экземпляр терминала. Просто казалось, что gpg2 был в каком-то странном состоянии на моем Mac.


0

Возможно, ваша конфигурация Git была установлена gpgsign = true . Попробуйте установить для него значение false, если вы не хотите назначать свои коммиты. Перейдите в папку вашего репозитория и измените файл

нано .git / config

Из этого...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

К этому...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false

0

Я решил проблему с установкой, а brew install gpg2затем сделалgit config --global gpg.program gpg2


0

Такая же ошибка может быть вызвана истекшим сроком действия ключа в конфигурации git.

Пожалуйста, проверьте содержимое cat .git/configи найдите signingkeyзначение и проверьте, не истек ли срок его действия. Если да, обновите его на новый.


0

Если вы используете смарт-карту / yubikey для хранения своего ключа GPG и устанавливаете signkeyконфигурацию git с помощью ключа, хранящегося на карте (и все приведенные выше ответы, похоже, не решают вашу проблему), ваш заблокированный PIN-код карты может быть основная причина этой проблемы.

Чтобы проверить заблокированный PIN-код:

gpg --card-status

Если счетчик похож на

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

Затем ваш PIN-код блокируется (после 3-х неудачных попыток).

Чтобы разблокировать PIN-код:

gpg --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. … detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 2
PIN unblocked and new PIN set.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

0

Для меня простой brew unintstall gnupg && brew cask reinstall gpg-suiteрешает вопрос.

Он удаляет (в моем случае) вручную установленный самодельным gpg и переустанавливает весь GPG Suite.


0

В моем случае у меня была смешанная конфигурация gpg и конфигурация smimesign, указанная в документации для подписи коммита здесь: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- ключ

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

Как упоминалось в ответе @Jason Thrasher, найдите всю конфигурацию git, связанную с gpg, используя:

git config -l | grep gpg

Затем отключите все как локально, так и локально, используя:

git config --global --unset <config_name>
git config --local --unset <config_name>

Затем измените конфигурацию, следуя официальной документации, приведенной выше. Надеюсь это поможет.


Также я использую gpg2
Гупта

0

В моем случае эта ошибка возникла при запуске git commitв маленьком tmuxокне, которое не соответствовало подсказке парольной фразы.

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

test
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

0

В моем случае мне пришлось сопоставить имя, хранящееся в настройках GitHub, с именем и комментарием ключа.

Так что, если ваше имя gpg --list-keysвозвращается uid [ultimate] Joe Blogs (fancy comment) <email@example.com>в .gitconfig, должно быть Joe Blogs (fancy comment).

Изначально мое имя было установлено как, Joe Blogsи GPG не мог найти мой ключ и показать ошибку «нет секретного ключа» в strace. К сожалению, эта ошибка не появилась без нее, straceи можно было бы получить общий

error: gpg failed to sign the data
fatal: failed to write commit object

0

У меня была эта проблема только сейчас, когда обновился VSCode. Я подумал, что агент GPG зависает, так как выполнение команды заняло несколько секунд, прежде чем произошла ошибка. Запуск gpgconf --kill gpg-agentсбросил это и исправил это для меня.


-7

Это поможет вам избавиться от него

git config commit.gpgsign false


1
Я не понимаю, почему голосование против, оно решило предложенную проблему как прелесть для меня.
Jms 05

2
Этой команды следует избегать. Это только удалит требование подписать коммит git, но не решит проблему аутентификации человека, который делает коммит.
Кайл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.