Помилка Git - gpg не вдалося підписати дані


149

Я щойно почав використовувати git і встановлюю git та gpg через homebrew. Чомусь я отримую цю помилку, коли git commit я переглянув так багато інших стаціонарних запитань щодо цієї теми, і жодне з них не працювало на мене. Як я можу виправити цю помилку, щоб я міг успішно завантажувати.

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

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


Можливий дублікат stackoverflow.com/questions/41502146/…
д-р Беко

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

Відповіді:


210

Для усунення несправностей спершу спробуйте дві речі:

  • запустити 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

Причиною збереження копії вашого ~/.gnupgdir є те, що 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

Я отримую цю помилку, коли запускаю другу команду: gpg: немає секретного ключа за замовчуванням: немає секретного ключа gpg: [stdin]: не вдалося дозначити: немає секретного ключа
ввімкніть

@Entitize Це, здається, вказує, що gpg не вважає, що у вас є якісь ключі, які слід використовувати для підписання. Дивіться додаткові кроки, які я додав до відповіді; якщо ви ніколи не бігали gpg2 --gen-keyраніше, то це потрібно зробити в першу чергу.
sidehowbarker

2
коли я запускаю ехо "тест" | gpg2 --clearsign, він дає мені: gpg-agent [-]: команда get_passphrase не вдалася: Невідповідний ioctl для пристрою gpg: проблема з агентом: Невідповідний ioctl для пристрою gpg: немає секретного ключа за замовчуванням: Операція скасована gpg: [stdin]: не вдалося провести розмитнення: операцію скасовано. Я спробував так багато інших можливостей, але нічого не вийшло. Чи є спосіб використовувати GIT без GPG!
Виступайте

9
Ви можете спробувати export GPG_TTY=$(tty). Наскільки існує спосіб використання git без gpg, ви можете це зробити за замовчуванням, або ж просто запустівши, git config --global commit.gpgsign falseщоб глобально відключити gpg підписання ваших зобов’язань.
sidehowbarker

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

71

Git повинен знати, з яким ключем він підписується.

Після встановлення GPG, gpg-агента та файлів gpg.conf (див. Цей посібник ), потрібно запустити

git config --global user.signingkey EB11C755

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

git config --global commit.gpgsign true

7
Я просто натрапив на це у випадку, якщо хтось інший виявився достатньо дурним, щоб робити те, що я робив: переконайтеся, що ви пишете це "підписом", а не "підписом".
ZNK

1
буквально цей коментар @ZNK зробив це для мене. Я написав це «підписом» замість «підписним ключем»
jzatt

1
Прийнята відповідь повинна навести це як перший крок усунення несправностей, оскільки іноді у вас вже є всі ваші ключі, це просто git забуває, який ключ використовувати.
f055

41

Якось ваш git налаштований на підписання GPG кожного коміту. Підписання за допомогою GPG не потрібно здійснювати або натискати за допомогою git. Можливо, виникла помилка, оскільки ваш механізм підпису 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 назад.


12
Дивовижно! git config --global --unset commit.gpgsignпрацював на мене :)
hpaknia

Ого!! це працювало для мене: git config --global --unset commit.gpgsign
Hardy Mathew

32

Зверніться до рішення @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

сек 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 у варить, отже, команда 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-program / usr / local / bin / pinentry-mac

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

export GPG_TTY=$(tty)

до ~ / .zshrc, якщо ви використовуєте zsh, інакше додайте до ~ / .bash_profile


1
macOS 10.15 (Catalina) постачається з версією GnuPG 2.2.17, тому не потрібно встановлювати його окремо, якщо ви не плануєте самостійно керувати оновленнями.
Джош Хабдас

18

Я цим користуюся. Він має підтримку zsha і працює в підсистемі Windows для Linux:

export GPG_TTY=$(tty)

2
Я використовую zsh на MacOS Catalina, і це була єдина зміна, яку мені потрібно було змусити його працювати. Дякую.
JP Lew

Я отримав помилку в ОП після копіювання моїх ключів у моє середовище WSL, виявляється, мені потрібно було це зробити, щоб надати підказку про пароль для ключа. Дякую.
Нарвік

10

Перевірте термін дії вашого ключа. Після того, як ви встановите дату закінчення терміну придатності (немає необхідності створювати новий ключ, якщо не захочете), 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

Не забудьте набрати 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

тоді вам добре піти! (- глобальна необов’язково)

Крім того, якщо ви не проти підписувати свій ключ ssh

git config commit.gpgsign false

зауважте, що це не рекомендується через проблеми безпеки відповідно до цього питання тут і тут


"Як варіант, якщо ви не проти підписувати за допомогою свого ключа ssh", що стосується ssh із підписанням?
сволочі

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

4

Мені довелося виправити 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

Щоб вирішити проблему, потрібно ввімкнути режим зворотного зв'язку в ~ / .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


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 була встановлена 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

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.

Після того, як я запустив ці команди, я несподівано знову міг без проблем виконувати підписані завдання. Я не змінив свої конфігураційні файли чи ключі - я навіть не створив свіжий екземпляр Terminal. Просто здавалося, що gpg2 якось перебуває в дивному стані на моєму комп'ютері.


0

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


0

Така ж помилка може бути спричинена і тоді, коли у вашому git config у вас закінчився термін дії.

Будь ласка, перевірте вміст cat .git/configі шукайте signingkeyзначення та перевірте, чи термін його дії закінчився. Якщо так, оновіть його новим.


0

Якщо ви використовуєте смарт-карту / yubikey для зберігання свого ключа GPG, і ви встановлюєте signkeygit 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

0

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

Він видаляє (в моєму випадку) gpg вручну з встановленою домашньою версією 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
Shubham Gupta

0

Якщо у вас раніше були налаштовані спеціальні налаштування та gpg, і він перестав працювати з нізвідки:

Перевірте, чи працює ваш gpg:

echo "test" | gpg --clearsign

Якщо це говорить gpg: signing failed: No pinentry, просто перезапустіть клієнт-демон демона gpg, який час від часу застрягає:

gpgconf --kill gpg-agent

Тепер це має працювати:

echo "test" | gpg --clearsign

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

-6

Це допоможе вам позбутися

git config commit.gpgsign false


1
Я не розумію голосування проти, це запропонувало це питання як шарм для мене.
Джмс

2
Цю команду слід уникати. Це лише зніме вимогу підписати git počin, а не вирішить питання автентифікації особи, яка здійснює зобов’язання.
Кайл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.