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, ID 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

і цілком очевидно отримувати ту ж помилку в будь-якому випадку.


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

Відповіді:


462

Я зіткнувся з цим питанням з 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 не вариться), він пропонує хороший тест:

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з brewmessed з символьними посиланнями таким чином gpgбуло видалено, я мав виправити посилання за допомогою brew link --overwrite gnupg2.
Бріс

8
гм ... не працює. як і раніше дає мою помилку під час входу в xcode.
Альберт Т. Вонг

1
@DrBeco Це не початкове місцеположення / поведінка? У мене все ще є те саме питання на osx (я думаю, я оновив свою заварку досить недавно), gpg1це все ще експортований виконуваний файл.
Енді Хайден

29
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentryнарешті виправили це для мене
Ден Бешард

317

Якщо використовуються gnupg2 та gpg-agent 2.x, обов'язково встановіть змінну середовища GPG_TTY.

export GPG_TTY=$(tty)

Дивіться документацію GPG про поширені проблеми .


17
Якщо ви використовуєте рибу, поставте set -x GPG_TTY (tty)у своєму профілі.
fasfsfgs

@StuartCardall Який сенс команди chown? Зазвичай він уже буде призначений вам системним процесом, коли ви входили в систему або створювали псевдо-tty. Якщо він належить комусь іншому, а ви не корінь, він вийде з ладу. Якщо група - це щось інше, це, мабуть, не має значення, і користувачі, як правило, не будуть в групі.
poolie

@poolie - це важливо , якщо вам suна rootна віддаленому сервері
Стюарт Cardall

6
Я додав змінну до ~/.zshrcі можу знову зробити коміти, тепер, коли вона правильно підключається до терміналу. Дякуємо за всю вашу допомогу!
Алекс Гуррола

Це також є в інструкціях GitHub: help.github.com/articles/telling-git-about-your-gpg-key
17:19

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
Я також повинен був запустити a killall gpg-agentпісля встановлення файлів config, тоді він працював!
Паскаль Людвіг

Як ми знаємо, що можемо довіряти людям, що стоять позаду pinentry-mac? Я не можу сказати, що ми не можемо, але GPGTools org є резервною копією дуже невеликої команди, і репо має лише 5 учасників та використання, brew install gnupgяка використовує роботу gnupg.org .
sunknudsen

У випадку, якщо це допомагає іншим, моя проблема полягала в тому, що у мене був недійсний локальний user.signingkeyнабір, який я не помічав у своїй конфігурації sourcetree, ані в моїх глобальних налаштуваннях (тому що я не думав дивитися на локальну конфігурацію) Переконайтеся, що обидва локальні ( git config --local --get user.signingkey) і global ( git config --global --get user.signingkey) є однаковими, а ще краще, скасуйте локальну, якщо вона недійсна ( git config --local --unset user.signingkey)
Glenn 'devalias'

на OSX (10.13.06), він дає таку помилку, bash: pinentry-program: команда не знайдена
cgl

59

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


2
Це зробило це для мене.
danyim

12
Використовуйте gpg-agent --daemonдля початку
FooBar

1
мені довелося також перезапустити gpg-агент
GnrlBzik

8
Щоб вбити процес на macOS:killall gpg-agent
incleaf

1
on ubuntugpgconf --kill gpg-agent
Адам

37

Дотримуйтесь наведеної нижче 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.застосовувати git commit -S -m "commitMsz"


1
це було рішенням для мене! Дуже дякую!
upInCloud

Відмінна інформація про те, як зрозуміти, чи це проблема.
Філіп

Це те, що зробило це для мене. Дуже дякую!
Аллан Гуватюдде

export GPG_TTY=$(tty)була хитрість. Додав це до мого .zshrcфайлу
Shane Stillwell

21

Для всіх, хто стикається з цією проблемою на комп'ютерах 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 та підпишіть ключ, який ви використовували, натискаючи знак на панелі меню: 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-агента, ви визначаєте щось, що називається passphrase. Тепер, коли passphraseв якийсь момент закінчується термін дії, і gpgвам потрібно ввести його ще раз, щоб розблокувати ваш ключ, щоб ви могли почати підпис знову.

Якщо ви користуєтесь будь-якою іншою програмою, яка взаємодіє з gpg, gpgзапит на введення вашої парольної фрази не відображається (в основному, gpg-agentколи демонізовано неможливо показати вам діалогове вікно введення 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 - підписання вашої роботи ", я вважаю, що у вас встановлена 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 тепер використовує тимчасовий файл, тому навколо цього можуть виникнути правильні проблеми.

Перейдемо до використання об’єкта tempfile, який обробляє важкі для нас справи, і додамо відсутній виклик очищення.


У мене встановлений 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>"

Тоді це спрацювало.

Сподіваюся, що це допомагає.


Це працювало для мене і git traceбуло дуже корисно.
філіп oghenerobo balogun

1
приятелю ... ти не можеш уявити, скільки годин я пробував, щоб розібратися в цьому, поки я не дійшов до твоєї відповіді ... це було називання ключа протягом усього часу .. дякую! Дякую тобі! Дякую тобі!
giomanda

8

Використовуючи cygwin, я нещодавно перейшов на gpg2. Тоді у мене була така ж проблема з підписанням з git після налаштування git config gpg.program gpg2.

Спробуйте echo "test" | gpg2 --clearsignперевірити, чи працює gpg2. Я знайшов це найпростіше рішення просто встановити git config gpg.program gpg, бо це працює. Але ви також отримаєте кращу помилку таким чином - наприклад, що вам потрібно встановити чітко.


Насправді, в деяких дистрибутивах 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/isissue/2798
swiknaba

8

У OS X, використовуючи gnupg2заварку, мені просто довелося вбити агент gpg , буває іноді:

pkill -9 gpg-agent

І встановіть envзмінну, якщо потрібно:

export GPG_TTY=$(tty)

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


2
Це працювало і для мене. Я створив новий псевдонім alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'.
ольдер

1
Це добре працює, дякую. Навіть не потрібно було потім встановлювати змінну env.
Нік Рамо

7

Я бачив подібні відповіді, але нічого точно, як те, що працювало на мене. У Linux мені довелося вбити і перезапустити gpg-agent:

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

Це зробило для мене трюк. Схоже, вам потрібно user.signingkeyвстановити приватний ключ, а також те, що кажуть деякі інші коментарі.

$ git config --global user.signingkey [your_key_hash]


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]: чіткий знак не вдалося: немає секретного ключа

Але після виправлення та сама команда успішно підписала повідомлення, тому я знала, що все знову працює!


Підтвердження цієї помилки виправлено під час імпорту дійсного ключа з Mac OSX Catalina до CentOS7. Білися двічі з цим звіром, намагаючись з'ясувати, чому він продовжує просити пароля серед іншого. Як не дивно, це було вже встановлено, щоб він ніколи не закінчувався, і я встановив, що він ніколи не закінчується.
Коді Б

5

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

Тимчасово зменшення рівня gnupg до 1.4.20 виправило проблему для мене.

Якщо ви користуєтеся домашньою мовою, і ви оновили ваші пакунки, як я, ви, ймовірно, можете просто запустити, brew switch gnupg 1.4.20щоб повернути назад.


3

Переконайтеся, що ваш електронний лист встановлено правильно.

git config --global user.email "user@example.com"

1
Це єдине рішення, яке працювало для мене, було корисно слідувати правильному методу генерації ключа GPG через github
Naz

1
У моєму випадку проблема полягала в тому, що я використовував електронну пошту компанії у конкретному репо-репортажі, для якого у мене не було створено PGP-ключ.
рубік

3

Якщо адреса електронної пошти, пов’язана з uid ключа вашого GPG, відрізняється від електронної пошти, яку ви використовуєте в git, вам потрібно буде додати інший ідентифікатор користувача до вашого ключа АБО використовувати ключ, який точно відповідає електронній пошті.

Ви можете додати інший UID, використовуючи:

$ gpg --edit-ключ

Дивіться мо /superuser/293184/one-gnupg-pgp-key-pair-two-emails


1
Це було для мене. Христе, як не є більш інформативним повідомлення про помилку, ніж "не вдалося підписати дані".
Алек

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виправив це для мене.

Сподіваюся, що це комусь допоможе.


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

там була купа ліній для читання (libreadline.so.BLAH-BLAH), тож я:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig

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 (та сама фізична машина, практично різна)


2

Я на Ubuntu 18.04 і отримав таку ж помилку, хвилювався і тижнями. Нарешті зрозумів, що gpg2 не спрямований ні на що. Так просто бігайте

git config --global gpg.program gpg

І тада, це працює як шарм.

Підписані зобов’язання

Тепер у ваших комісіях буде підтверджений тег.


2

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


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(він перезапускається наступного разу).


1

Жодна з наведених відповідей, здавалося, не відповідала моїй проблемі. Мій gpgбінарний ( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) був встановлений як частина GPG Suite , а не заварюванням.

Тим не менш, я відчув, що порада зводиться до: "використовувати те, що gpgє бінарним - це найновіше, що доступне на заварі". Тому я спробував:

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і натиснув "Перевірити наявність оновлень ...". З новою версією: підписані комісії знову працювали правильно.


Я спробував оновити до останньої версії ... і це не спрацювало. намагаються увійти в xcode.
Альберт Т. Вонг


1

Дуже схоже на @birchlabs, після багатого копання / пошуку я виявив, що це не GPG, а швидше GPG Suite. Я це зробив, cask reinstall gpg-suiteі це вирішило це за мене.


0

Якщо це просто трапилося випадковим чином і працювало чудово в минулому, як у моєму випадку, спробуйте вийти ( cmd+shift+q) і ввійти назад. Працювало для мене


0

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


0

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

Цей не застосовується, якщо ви використовуєте агент GUI або щось, що не використовує ncurses.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.