Ошибка git - gpg не смог подписать данные
Я только начал использовать git, и я установил git и gpg с помощью homebrew. По какой-то причине я получаю эту ошибку, когда я делаю git commit
Я посмотрел на очень много других вопросов о стековом потоке, касающихся этой темы, и ни один из них не помог мне. Как я могу исправить эту ошибку, чтобы я мог успешно загрузить.
error: gpg failed to sign the data
fatal: failed to write commit object
34 ответа
Для устранения неполадок, сначала нужно попробовать две вещи:
- бежать
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
вариант, вы можете попробовать это:
cp ~/.gnupg ~/.gnupg-GOOD
сохранить копию вашего~/.gnupg
вернуться к позже, если это необходимо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, то вам нужно создать его:
- бежать
gpg2 --gen-key
, чтобы GnuPG провел вас через шаги для создания пары ключей
Если вы получили сообщение об ошибке "Неправильный ioctl для устройства", сделайте следующее:
- бежать
export GPG_TTY=$(tty)
и / или добавить это к вашему~/.bashrc
или же˜/.bash_profile
Git должен знать, с каким ключом он подписывает.
После того, как вы настроили GPG, gpg-agent и ваши файлы gpg.conf (см. Это руководство), вам нужно запустить
git config --global user.signingkey EB11C755
Очевидно, замените открытый ключ в конце своим собственным. Если вы хотите, чтобы каждый коммит был подписан по умолчанию, используйте
git config --global commit.gpgsign true
Я использую это. Он поддерживает zsha и работает в подсистеме Windows для Linux:
export GPG_TTY=$(tty)
Каким-то образом ваш git настроен на подпись GPG при каждом коммите. Подписание с помощью GPG не требуется для фиксации или отправки с использованием git. Вероятно, это приводит к ошибке, потому что ваш механизм подписи gpg еще не настроен.
Если вы новичок в git, попробуйте сначала запустить его без подписи GPG, а затем добавьте вход позже, если вам это действительно нужно.
Вы можете проверить, как ваш git настроен в отношении gpg, выполнив:
git config -l | grep gpg
Который может производить ноль или более строк, в том числе:
commit.gpgsign=true
Если "commit.gpgsign" имеет значение true, значит, у вас включена подпись gpg. Отключить его с помощью:
git config --global --unset commit.gpgsign
Затем попробуйте запустить свой коммит снова. Теперь он должен работать без подписи gpg. После того, как вы запустите базовый git, попробуйте добавить подписку gpg обратно к миксу.
Обратитесь к @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 2017-06-29 [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
Проверьте срок действия вашего ключа. Как только вы установите дату окончания срока действия (нет необходимости создавать новый ключ, если вы этого не хотите), git
будет работать как обычно.
Один из способов исправить просроченный ключ:
(Заметка: $
представляет приглашение командной строки, введите команды после приглашения; нажмите Enter после каждой команды)
$ gpg2 --list-keys
найти соответствующий идентификатор ключа (символы после \
на pub
линия)
$ gpg2 --edit-key <key id>
- это открывает оболочку gpg с приглашением, измененным на gpg>
gpg> expire
- следуйте инструкциям, чтобы установить новую дату истечения срока действия для первичного ключа
Далее, если есть подразделы, срок действия которых истек (sub
показывает на линии), сбрасывают даты их истечения тоже:
gpg> key 1
- выбирает первый подключgpg> expire
- следуйте инструкциям, чтобы установить новую дату истечения срока действия для подключа
При необходимости повторите для каждого последующего подключа.
Решение:
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
и тебе должно быть хорошо!
Это работало для меня на 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
обратите внимание, что это не рекомендуется из-за проблем безопасности в соответствии с этим вопросом здесь и здесь
Пришлось исправить gpg.program на абсолютный путь к gpg:
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Я использую Windows с cygwin.
Если раньше он работал и просто указывал на сбой, убейте агента и повторите попытку:
gpgconf --kill gpg-agent
Проверьте, активен ли агент снова:
echo "test" | gpg --clearsign
Если у вас ранее были настроены pinentry и gpg, и они перестали работать из ниоткуда:
Проверьте, работает ли ваш gpg:
echo "test" | gpg --clearsign
Если это говорит gpg: signing failed: No pinentry
, просто перезапустите клиент демона gpg, который время от времени зависает:
gpgconf --kill gpg-agent
Теперь должно работать:
echo "test" | gpg --clearsign
Используйте GIT_TRACE=1, чтобы увидеть, где произошел сбой Git, затем проверьте все пользовательские конфигурации, используемые Git и где они определены, а затем переопределите в соответствии с вашими потребностями с помощью:
GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"
git config --list --show-scope --show-origin
Для меня у меня был
error: gpg failed to sign the data
а также
fatal: failed to write commit object
потому что Git по какой-то причине использовал smimesign по умолчанию, даже если я отключил
gpg.x509.program
key, а smimesign не смог найти мой ключ.
Поэтому мне пришлось явно указать Git использовать вместо этого gpg :
git config --local gpg.x509.program gpg
Я столкнулся с этой проблемой после обновления до gnupg 2.x. Было бы видно, что gpg2 ссылается на ключи по-другому: у меня все еще было signingkey = ABC98F11
(настройка gpg v1) в моем ~/.gitconfig
, Ключевые идентификаторы для gpg2 длиннее. Ищите их с gpg --list-secret-keys
Эта ошибка также может возникнуть, когда истек срок действия вашего ключа GPG. Создание нового ключа и добавление его в Git должно решить эту проблему.
В моем случае эта ошибка возникла при запуске 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
Для меня эта ошибка начала происходить с 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)
может быть основным исправлением и единственной вещью, необходимой в некоторых случаях.
Может быть, ваш конфиг Git был установлен gpgsign = true. Попробуйте установить его в false, если вы не хотите назначать свои коммиты. Перейдите в папку вашего хранилища и измените файл
nano .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
В моем случае мне пришлось сопоставить имя, хранящееся в настройках 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
Я сделал 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 ]
сделал новый ключ без добавления отдельных подразделов для решения проблемы.
Для меня это решило то, что имя ключа соответствовало моему имени пользователя git. Я предполагаю, что электронные письма тоже должны совпадать. Возможно, это связано с тем, что я использую GPG KeyChain на моем Mac. Не уверен.
Когда я заполнял это поле, я думал, что называю ключ, но думаю, он запрашивал мое имя (имя пользователя git).
После долгих поисков я обнаружил, что в моем случае проблема заключалась в ключе gpg.
Вы можете попробовать запустить
gpg --status-fd=2 -bsau <your GPG key>
если ваш ключ GPG правильный.
Чтобы обновить правильный ключ, сделайте следующее: проверьте ключ, используя:
gpg --list-secret-keys --keyid-format=long
Он должен иметь следующий вывод:
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot
ssb 4096R/42B317FD4BA89E7A 2016-03-10
А затем обновите ключ, используя:
git config --global user.signingkey 3AA5C34371567BD2
Теперь снова проверьте фиксацию, и она должна быть успешной, если проблема была в ключе. Вам нужно установить парольную фразу для обновления ключа, что вы можете сделать с помощью документации GitHub.
Более подробная информация находится по адресу: https://gist.github.com/paolocarrasco/18ca8fe6e63490ae1be23e84a7039374 .
У меня была эта ошибка на macos - чтобы попытаться устранить неполадки, я попытался перечислить ключи, чтобы узнать, истек ли они с помощью gpg2 --list-keys
- Я проверил, что срок действия ключей не истек, и что правильный ключ был установлен в моей конфигурации, используя git config --global user.signingkey
.
После того, как я выполнил эти команды, я внезапно снова смог без проблем выполнять подписанные коммиты. Я не менял свои файлы конфигурации или ключи - я даже не создавал новый экземпляр терминала. Просто казалось, что gpg2 был в каком-то странном состоянии на моем Mac.
Если вы используете смарт-карту /yubikey для хранения ключа GPG, и вы установилиsignkey
git config с помощью ключа, хранящегося на карте (и весь приведенный выше ответ, похоже, не решает вашу проблему), ваш заблокированный 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
Если вы используете Windows PowerShell (5.1+), я думаю, эта команда будет работать.
- получить путь к программе gpg с помощью этой команды.
(Get-Command gpg).Path
- после получения пути скопируйте путь.
- используйте эту команду
git config gpg.program <your path>
попробуй совершить. Удачного кодирования!!!
Я решил проблему установки brew install gpg2
затем делать git config --global gpg.program gpg2
Для меня простой brew unintstall gnupg && brew cask reinstall gpg-suite
решает вопрос.
Он удаляет (в моем случае) вручную установленный самодельным gpg и переустанавливает весь GPG Suite.
Для моей системы Linux с графическим интерфейсом пользователя и gpg 2.2.19 не было убито gpg-agent (который запускается снова)
$DISPLAY
или установка
$GPG_TTY
работал у меня, потому что он пытался использовать pinentry-gnome для запроса пароля с консоли. И срок действия моего ключа не истек.
Из ответа SuperUser на аналогичный вопрос: Как заставить GPG использовать pinentry в консольном режиме для запроса паролей? , проблема также может возникнуть, если в вашей системе есть графический интерфейс, такой как GNOME, и ваш диспетчер пакетов настроен для использования программы pinentry с графическим интерфейсом, что является причиной зависания.
Мне пришлось переключиться на pinentry-tty, чтобы GPG снова подписывал сообщения. В Ubuntu это можно сделать, выполнив шаги из ссылки, которую я процитирую здесь:
sudo apt install pinentry-tty
sudo update-alternatives --config pinentry
Вторая команда покажет вам список программ pinentry и попросит вас ввести номер, чтобы выбрать одну, поэтому введите тот, который соответствует pinentry-tty, и затем без каких-либо дополнительных усилий подписание сообщений (и git коммитов) снова должно работать.
В моем случае у меня была смешанная конфигурация gpg и конфигурация smimesign, указанная в документации для подписи коммита здесь: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key
После нескольких часов работы я обнаружил, что лучший способ исправить это - отключить все, что связано с gpg, и перенастроить gpg.
Как упоминалось в ответе @Jason Thrasher, найдите всю конфигурацию git, связанную с gpg, используя:
git config -l | grep gpg
Затем отключите все как локально, так и локально, используя:
git config --global --unset <config_name>
git config --local --unset <config_name>
Затем выполните перенастройку, следуя официальной документации, приведенной выше. Надеюсь это поможет.
Такая же ошибка может быть вызвана истекшим сроком действия ключа в конфигурации git.
Пожалуйста, проверьте содержание cat .git/config
и ищи signingkey
значение и проверьте, не истек ли он. Если да, обновите его на новый.
У меня была эта проблема на обеих платформах Linux/ Windows, и в моем случае мне просто нужно было уделять более пристальное внимание результату. Это было ошеломляюще, потому что я мог использовать ту же настройку для подписи коммитов в других репозиториях.
git commit -m "test signing"
gpg: skipped "***63231079***": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object
Я добавил акцент на «пропущенную» строчку. Обратите внимание, что иногда, когда вы клонируете репо, им назначается ключ: эта проблема меня настолько сбила с толку, что я уничтожил разветвленное репо, к которому у меня был доступ, и повторно форкнул на github. Затем, поскольку я думал о «глобальной конфигурации», я никогда не думал смотреть на локальную конфигурацию репозитория, и когда я это сделал, я заметил следующее:
[user]
signingkey = 63231079
Ну, конечно, это не сработает, nimrod, git по умолчанию сначала использует локальные настройки, поэтому ваш ключ так и не получил. Я установил указатель через