gpg nie podpisał danych krytycznych: nie można zapisać obiektu zatwierdzenia [Git 2.10.0]

319

Śledziłem kilka artykułów na temat pięknych atrybutów informacji o wersji Git 2.10 . Przechodzenie przez które uaktualniłem gita do 2.10.0 i wprowadziłem zmiany w globalnej .gitconfignastępująco:

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = [email protected]
    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

Ale teraz, gdy próbuję podpisać swoje zobowiązania za pomocą

git commit -a -S -m "message"

Widzę następujący błąd -

Aby odblokować tajny klucz, potrzebujesz hasła

użytkownik: „XYZ (podpisany cyfrowo)”

2048-bitowy klucz RSA, ID AAAAAAAA, utworzony 01.01.2016

błąd: gpg nie podpisał danych krytycznych: nie można zapisać obiektu zatwierdzenia

Uwaga - nadal mogę zatwierdzać zmiany za pomocągit commit -a -m "message"

Czy istnieje sposób na przezwyciężenie tego samego? Lub jakakolwiek zmiana wymagana w gpgkonfiguracjach, aby dogadać się z aktualizacją git?


Aktualizacja 1

Poszukuję także dalszej przydatności, po Czy istnieje sposób na „autosign” zatwierdzający w Git kluczem GPG? . Klucz został już skonfigurowany za pomocą

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

i oczywiście pojawia się ten sam błąd.

Naman
źródło
3
Mam podobny problem. Odinstalowałem Git 2.8 (git-scm) w systemie Windows. I zainstalowany 2.10. Teraz dostaję za gpg failed to sign the datakażdym razem, gdy używam -S. W 2.8 mogę bez problemu podpisać zatwierdzenie. Nie wiem co się stało.
Iluminator
5
Dodanie user.signingkeynaprawiło mój problem, o dziwo.
Xavier Ho
1
@ nullpointer Usunąłem stamtąd swoją odpowiedź, ponieważ po głębokim spojrzeniu zdałem sobie sprawę, że to duplikat!
Shayan Amani
1
Jak na ironię, zmieniłem maszynę, aby skonfigurować wszystko od nowa, i skończyłem na szukaniu własnego pytania i żadne z sugerowanych rozwiązań nie wydaje mi się wystarczająco czyste, aby po prostu zacząć.
Naman
1
Dla mnie poprawka brzmiała: git config user.namewas! = Nazwa używana podczas tworzenia klucza PGP
stacksonstacks

Odpowiedzi:

462

Wystąpił ten problem z OSX.

Oryginalna odpowiedź:

Wygląda na to, że aktualizacja gpg (naparu) została zmieniona na lokalizację gpgna gpg1, możesz zmienić plik binarny, w którym git sprawdza gpg:

git config --global gpg.program gpg1

Jeśli nie masz gpg1: brew install gpg1.

Zaktualizowana odpowiedź:

Wygląda na to, że gpg1 jest przestarzałe / „delikatnie przestaje być używane” , więc prawdopodobnie powinieneś zaktualizować gpg2, niestety wymaga to jeszcze kilku kroków / trochę czasu:

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

Pierwsza część instaluje gpg2, a druga to włamanie wymagane do jego użycia . Aby rozwiązać problemy, zapoznaj się z tą odpowiedzią (choć dotyczy Linuksa, a nie parzenia), sugeruje dobry test:

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

Jeśli test zakończy się powodzeniem (brak błędu / danych wyjściowych zawiera sygnaturę PGP), pomyślnie zaktualizowano do najnowszej wersji gpg.

Powinieneś teraz móc ponownie używać podpisywania git!
Warto zauważyć, że musisz mieć:

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

Uwaga: po uruchomieniu zatwierdzonego podpisu możesz go zweryfikować za pomocą:

git log --show-signature -1

który będzie zawierał informacje gpg dla ostatniego zatwierdzenia.

Andy Hayden
źródło
7
Ustawienie gpg.programu na / usr / local / bin / gpg (no „1”) naprawiło to dla mnie.
Iskar
5
Wygląda na to, że aktualizacja gnupg2z brewpomieszanymi z dowiązaniami symbolicznymi gpgzostała w związku z tym usunięta brew link --overwrite gnupg2.
Brice
8
hm ... nie działa. nadal wyświetla mój błąd podczas logowania do xcode.
Albert T. Wong,
1
@DrBeco nie jest to pierwotna lokalizacja / zachowanie? Nadal mam ten sam problem z systemem OSX (myślę, że dość niedawno zaktualizowałem swój napar), gpg1jest to nadal plik wykonywalny z eksportem.
Andy Hayden,
29
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentryw końcu to naprawił
Dan Bechard
317

Jeśli używane są gnupg2 i gpg-agent 2.x, należy ustawić zmienną środowiskową GPG_TTY.

export GPG_TTY=$(tty)

Zobacz dokumentację GPG na temat typowych problemów .

Koraktor
źródło
17
Jeśli używasz ryb, załóż set -x GPG_TTY (tty)swój profil.
fasfsfgs
@StuartCardall Jaki jest sens polecenia chown? Zwykle zostanie ci już przypisany przez proces systemowy, gdy zalogujesz się lub utworzysz pseudo-tty. Jeśli jest własnością kogoś innego i nie jesteś rootem, zakończy się niepowodzeniem. Jeśli grupa jest czymś innym, prawdopodobnie nie ma to znaczenia, a użytkownicy zazwyczaj nie będą w grupie tty.
poolie
@poolie - to ważne, jeśli wam susię rootna zdalnym serwerze
Stuart Cardall
6
Dodałem zmienną ~/.zshrci mogę ponownie zatwierdzać zmiany, teraz, gdy poprawnie łączy się ona z terminalem. Dzięki za wszelką pomoc!
Alex Gurrola
Jest to również zawarte w instrukcjach GitHub: help.github.com/articles/telling-git-about-your-gpg-key
bonh
198

Jeśli wszystko zawiedzie, użyj, GIT_TRACE=1aby sprawdzić, co właściwie robi 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

Teraz uruchom ręcznie błędne polecenie:

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

Okazuje się, mój klucz wygasł, gitnie można go winić.

Bombe
źródło
34
Dobra wskazówka do debugowania. +1
VonC,
4
To pomogło mi rozwiązać mój własny problem i jest rozwiązaniem dla każdego rodzaju problemu z tym komunikatem o stanie. +1
xHocquet
Dzięki za przejście do debugowania. Mój klucz również wygasł.
Sgnl
2
Dzięki! Doprowadziło mnie to do mojego problemu. O dziwo, mój lokalny .git/configmiał nameokreślony w jednym projekcie, który nie pasował do mojego e-maila do podpisu. To wystarczyło, aby to odrzucić.
kross
1
Cóż, wykonywanie gpg -bsau <key>na moim komputerze niczego nie wykonuje. Czy to ma trwać zbyt długo, aby wykonać? Czy to oznacza, że ​​można użyć klucza? @VonC jakieś spostrzeżenia?
Naman
82

Mam Sporządzono go przez ten krótki i łatwy przepis:

Automatyczne podpisywanie zatwierdza w systemie macOS (globalnie i przy użyciu różnych IDE):

Zdobądź signingkeyw ten sposób .

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

Umieść następujące dane w gpg.confpliku (edytuj plik za pomocą nano ~/.gnupg/gpg.confpolecenia):

no-tty

Umieść następujące dane w gpg-agent.confpliku (edytuj plik za pomocą nano ~/.gnupg/gpg-agent.confpolecenia):

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

Aktualizacja :

Może być konieczne wykonanie killall gpg-agentpolecenia po edycji pliku konfiguracji gpg.conf, zgodnie z komentarzami. Jak mówi samoobjaśniające polecenie, to polecenie spowoduje zakończenie działania agenta GPG (Gnu Privacy Guard).

Shayan Amani
źródło
2
Czy potrafisz także wyjaśnić, co robią te polecenia? Pomoże w zrozumieniu.
Droid
7
Musiałem też uruchomić killall gpg-agentpo ustawieniu plików konfiguracyjnych, a potem zadziałało!
Pascal Ludwig
Skąd wiemy, że możemy zaufać ludziom z tyłu pinentry-mac? Nie twierdzę, że nie możemy, ale organizacja GPGTools jest tworzona przez bardzo mały zespół, a repo ma tylko 5 autorów, brew install gnupgktórzy korzystają z gnupg.org .
sunknudsen
W przypadku, gdy pomaga to innym, moim problemem było to, że miałem nieprawidłowy user.signingkeyzestaw lokalny , czego nie zauważyłem w mojej konfiguracji sourcetree, ani w moich ustawieniach globalnych (ponieważ nie myślałem, aby spojrzeć na lokalną konfigurację) Upewnij się, że zarówno lokalny ( git config --local --get user.signingkey) i global ( git config --global --get user.signingkey) są takie same, a nawet lepiej, rozbroić lokalny, jeśli jest nieprawidłowy ( git config --local --unset user.signingkey)
Glenn 'devalias'
w OSX (10.13.06) wyświetla następujący błąd, bash: pinentry-program: nie znaleziono polecenia
cgl
59

Może pomóc w zabiciu procesu, gpg-agentktóry może utknąć w starych danych. Więc nowy gpg-agentzaczął prosić o hasło.

MaximKostrikin
źródło
2
Zrobiło to dla mnie.
danyim
12
Użyj, gpg-agent --daemonaby go uruchomić
FooBar,
1
musiałem zrestartować również gpg-agent
GnrlBzik
8
Aby zabić proces na macOS:killall gpg-agent
incleaf
1
na ubuntugpgconf --kill gpg-agent
Adam
37

Postępuj zgodnie z poniższym adresem URL, aby skonfigurować podpisane zatwierdzenie https://help.github.com/en/articles/telling-git-about-your-signing-key

jeśli nadal uzyskiwanie gpg nie udało się podpisać danych krytycznych: nie można zapisać obiektu zatwierdzenia

to nie jest problem z gitem, to z GPG wykonaj poniższe kroki

1.gpg --version

  1. echo "test" | gpg --clearsign

jeśli pokazuje:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
  1. następnie użyj export GPG_TTY=$(tty)

4. następnie ponownie spróbuj uzyskać echo "test" | gpg --clearsign podpis PGP.

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

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

jayesh
źródło
1
to było dla mnie rozwiązanie! Wielkie dzięki!
upInCloud,
Doskonałe omówienie sposobu rozwiązania tego problemu.
Philippe Signoret
To właśnie to dla mnie zrobiło. Wielkie dzięki!
Allan Guwatudde
export GPG_TTY=$(tty)była sztuczka. Dodałem to do mojego .zshrcpliku
Shane Stillwell
21

Każdemu, kto napotyka ten problem na komputerach MacOS , spróbuj:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac (Jeśli potrzebne)
  4. gpg --full-generate-key Utwórz klucz za pomocą algorytmu.
  5. Uzyskaj wygenerowany klucz, wykonując: gpg --list-keys
  6. Tutaj ustaw klucz 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. Jeśli chcesz wyeksportować swój klucz do GitHub, a następnie: gpg --armor --export <key> i dodaj ten klucz do GitHub w kluczach GPG: https://github.com/settings/keys (z dołączoną linią START i END)

Jeśli problem nadal występuje:

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

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

Jeśli problem nadal występuje:

Zainstaluj https://gpgtools.org i podpisz użyty klucz, naciskając Znak z paska menu: Klawisz -> Podpisz

Jeśli problem nadal występuje:

Przejdź do: globalnym .gitconfigpliku, który w moim przypadku jest: /Users/gent/.gitconfig i modyfikować .gitconfig pliku (należy upewnić się, że e-mail i nazwa są takie same, z tym, który został utworzony podczas generowania klucza) :

[user]
	email = [email protected]
	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

Gent Berani
źródło
2
Dodanie „gpsign = true” w .gitconfig naprawiło to dla mnie
Pierre
18

Moje dwa centy tutaj:

Kiedy tworzysz i dodajesz klucz do gpg-agent, definiujesz coś o nazwie passphrase. Teraz, gdy passphrasew pewnym momencie wygasa, igpg musisz wprowadzić go ponownie, aby odblokować klucz, abyś mógł zacząć podpisywać ponownie.

Gdy używasz innego programu, z którym współpracujesz gpg, gpgmonit o podanie hasła nie pojawia się (w zasadzie, gpg-agentgdy demonizowany nie może wyświetlić okna dialogowego wprowadzania wstdin ).

Jednym z rozwiązań jest gpg --sign a_file.txtwprowadzenie hasła, które wprowadziłeś podczas tworzenia klucza, a następnie wszystko powinno być w porządku (gpg-agent powinno się automatycznie podpisać)

Zobacz tę odpowiedź na temat ustawiania dłuższych limitów czasu dla hasła, abyś nie musiał tego robić cały czas.

Lub możesz całkowicie usunąć hasło za pomocą ssh-keygen -p

Edycja: zrób a, man gpg-agentaby przeczytać kilka rzeczy o tym, jak powyższe dzieje się automatycznie i dodaj linie:

GPG_TTY=$(tty)
export GPG_TTY

na swoim .bashrc, jeśli używasz bash (jest to poprawna odpowiedź, ale utrzymuję mój tok myślenia powyżej)

George Daramouskas
źródło
Dzięki @ george-daramouskas, to był mój problem.
Nic Barker,
10

Aktualizacja października 2016: wydanie 871 wspomniano „Podpisywanie przestało działać w Git 2.9.3”

Git dla Windows 2.10.1 wydany dwa dni temu (4 października 2016) naprawił podpisywanie interaktywnych GPG w commits i tagach.

ostatnia zmiana znaku gpg w git (która nie wprowadza żadnego problemu w Linuksie) ujawnia problem w sposobie, w jaki w systemie Windows nie-MSYS2-git wchodzi w interakcje z MSYS2-gpg.


Oryginalna odpowiedź:

Czytając „ 7.4 Git Tools - podpisywanie swojej pracy ”, zakładam, że masz user.signingkeyskonfigurowaną konfigurację.

Ostatnim dużym refaktoryzowaniem (przed Git 2.10) wokół gpg było zatwierdzenie 2f47eae2a , tutaj ten komunikat o błędzie został przeniesiony dogpg-interface.c

Dziennik tego pliku ujawnia ostatnią zmianę w zatwierdzeniu af2b21e (Git 2.10)

gpg2 domyślnie używa już długiego formatu, ale większość dystrybucji wydaje się nadal mieć starszą wersję 1.x ze względu na kompatybilność. Starsze wersje gpg pokazują tylko 32-bitowy krótki identyfikator, co jest dość niepewne.

To nie ma znaczenia dla samej weryfikacji : jeśli weryfikacja się powiedzie, sygnatura pgp jest dobra.
Ale jeśli nie masz jeszcze klucza i chcesz go pobrać lub chcesz dokładnie sprawdzić, który klucz został użyty do weryfikacji i chcesz go sprawdzić, powinniśmy go określić z większą dokładnością.

Sprawdź więc, jak określiłeś swój user.signingkey konfigurację oraz używaną wersję gpg (gpg1 lub gpg2), aby sprawdzić, czy mają one wpływ na komunikat o błędzie.

Istnieje również zatwierdzenie 0581b54, które zmienia warunek gpg failed to sign the datakomunikatu o błędzie (w uzupełnieniu do zatwierdzenia 0d2b664 ):

Obecnie w ogóle nie czytamy ze stderr. Jednak będziemy chcieli w plastrze przyszłości, więc ten przygotowuje również nas tam (iw tym przypadku gpg robi zapis przed przeczytaniem wszystkie wejścia, choć znowu, to jest mało prawdopodobne, że kluczowym uid zapełni się bufor rury).

Zatwierdzenie 4322353 pokazuje, że gpg używa teraz pliku tymczasowego, więc mogą występować odpowiednie problemy.

Przejdźmy do korzystania z obiektu tempfile, który obsługuje dla nas trudne przypadki, i dodajmy brakujące wywołanie czyszczenia.

VonC
źródło
Mam user.signingkeyskonfigurowaną konfigurację. Również za pomocą gpg (GnuPG) 2.0.3.
Naman
@nullpointer Zredagowałem swoją odpowiedź. Czy możesz sprawdzić, czy problem nadal występuje w Gti For Windows 2.10.1.
VonC,
przepraszam za późną aktualizację, działającą w systemie MacOSX, a nie Windows, więc nie mogłem tego zweryfikować.
Naman
10

Ślad git był bardzo odkrywczy dla mojej sytuacji ...

   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 <[email protected]>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

Musiałem wygenerować klucz początkowy dla gitsprawdzanego formatu . Najlepiej jest skopiować przekazaną wartość-bsau dzienników w obecnej postaci i użyć poniżej.

Więc staje się

   gpg --quick-generate-key "full name <[email protected]>"

Potem zadziałało.

Mam nadzieję, że to pomaga.

phyatt
źródło
To działało dla mnie i git tracebyło bardzo pomocne.
philip oghenerobo balogun
1
kolego ... nie możesz sobie wyobrazić, ile godzin spędziłem próbując rozwiązać ten problem, dopóki nie dotarłem do Twojej odpowiedzi ... to było nazywanie klucza przez cały czas ... dziękuję! Dziękuję Ci! Dziękuję Ci!
giomanda
8

Korzystając z cygwin, niedawno przełączyłem się na gpg2. Potem miałem ten sam problem z podpisywaniem się z git po ustawieniu git config gpg.program gpg2.

Spróbuj echo "test" | gpg2 --clearsignsprawdzić, czy gpg2 działa. Znalazłem to najłatwiejsze rozwiązanie do ustawienia git config gpg.program gpg, ponieważ to działa. Ale w ten sposób otrzymasz lepszy błąd - np. Że musisz zainstalować pinentry.

lucidbrot
źródło
W rzeczywistości w niektórych dystrybucjach Linuksa możesz mieć ten sam problem. Git zawsze używa gpg, a nie gpg2. Zobacz także: stackoverflow.com/questions/34766123/…
rugk
To ujawniło mi błąd, gpg: signing failed: Inappropriate ioctl for devicektóry można rozwiązać export GPG_TTY=$(tty). Źródło: github.com/keybase/keybase-issues/issues/2798
swiknaba
8

Na OS X, używając gnupg2via brew musiałem zabić agenta gpg , czasem się zdarza:

pkill -9 gpg-agent

W envrazie potrzeby ustaw zmienną:

export GPG_TTY=$(tty)

Zobacz także typowe problemy z GPG i tę odpowiedź tutaj.

Trainoasis
źródło
2
To również działało dla mnie. Utworzyłem nowy alias alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'.
oalders
1
Działa dobrze, dzięki. Nie musiałem nawet później ustawiać zmiennej env.
Nick Rameau
7

Widziałem podobne odpowiedzi, ale nic dokładnie nie działało dla mnie. W systemie Linux musiałem zabić i uruchomić ponownie za gpg-agentpomocą:

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

To załatwiło sprawę. Wygląda na to, że musisz również user.signingkeyustawić swój klucz prywatny na podstawie tego, co mówią inne komentarze.

$ git config --global user.signingkey [your_key_hash]
Engineero
źródło
6

Może być wiszącym agentem gpg.

Spróbuj gpgconf --kill gpg-agent jak omówiono tutaj

Lounge9
źródło
6

Otrzymałem ten błąd na Ubuntu 18.04 i okazało się, że mój klucz wygasł .

Aby to zobaczyć, uruchomiłem to i potwierdziło, że moje klucze wygasły:

gpg --list-keys

Aby to naprawić, uruchomiłem (używając identyfikatora wyświetlonego w poprzednim poleceniu):

gpg --edit-key <ID>

Stamtąd rozszerzył wygaśnięcie key 0i key 1następującą instrukcją , która sprowadzała się do pisania key 0wtedy expirei postępując zgodnie z instrukcjami. Następnie powtarzam dla key 1.

Następnie, aby to przetestować, uruchomiłem:

echo test | gpg --clearsign

A przed poprawką nie powiodło się z błędem:

gpg: brak domyślnego tajnego klucza: brak tajnego klucza
gpg: [stdin]: niepowodzenie kasowania: brak tajnego klucza

Ale po poprawce to samo polecenie pomyślnie podpisało wiadomość, więc wiedziałem, że wszystko znowu działa!

gMale
źródło
Potwierdzenie tego rozwiązało problem podczas importowania prawidłowego klucza z Mac OSX Catalina do CentOS7. Walczyłem z tą bestią przez ponad dwie godziny, próbując dowiedzieć się, dlaczego między innymi prosiła o hasło. Co dziwne, już ustawiono, aby nigdy nie wygasało, a ja ustawiłem, aby nigdy nie wygasało.
Cody B
5

Natrafiłem na ten sam problem. Z przyjemnością informuję, że problem nie leży w tym, git 2.10.0ale w czymgnupg 1.4.21 .

Tymczasowe obniżenie gnupga do 1.4.20 naprawiło problem.

Jeśli używasz homebrew i zaktualizowałeś swoje pakiety tak jak ja, prawdopodobnie możesz po prostu uruchomić, brew switch gnupg 1.4.20aby przywrócić.

Arno
źródło
3

Upewnij się, że masz poprawnie ustawiony adres e-mail.

git config --global user.email "[email protected]"
Weston Reed
źródło
1
To jedyne rozwiązanie, które działało dla mnie, było pomocne, aby postępować zgodnie z prawidłową metodą generowania klucza GPG za pośrednictwem github
Naz
1
W moim przypadku problem polegał na tym, że korzystałem z firmowego adresu e-mail w konkretnym repozytorium, dla którego nie wygenerowałem klucza PGP.
Rubick
3

Jeśli wiadomość e-mail przypisana do identyfikatora UID klucza GPG jest inna niż wiadomość e-mail używana w git, musisz dodać kolejny identyfikator użytkownika do swojego klucza LUB użyć klucza, który dokładnie pasuje do wiadomości e-mail.

Możesz dodać kolejny identyfikator UID, używając:

$ gpg --edit-key

Zobacz mo /superuser/293184/one-gnupg-pgp-key-pair-two-emails

JavaRocky
źródło
1
To było dla mnie. Chryste, jak nie ma bardziej pouczającego komunikatu o błędzie niż „nie udało się podpisać danych”.
Alec
3

Musiałem jakoś przypadkowo zaktualizować gpg, ponieważ dostałem to po próbie sprawdzenia, czy gpg działa:

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.

Bieganie gpgconf --kill allnaprawiło to dla mnie.

Mam nadzieję, że to komuś pomoże.

Visokoo
źródło
2

Miałem podobny problem z najnowszymi źródłami Gita (2.12.2) zbudowanymi wraz z najnowszymi źródłami wszystkich jego zależności (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring itp.).

Okazuje się, libreadlineże powodował problemy z GnuPG:

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

I oczywiście próba uzyskania przydatnych informacji od Gita -vvvnie powiodła się, więc niepowodzenie było tajemnicą.

Aby rozwiązać błąd PGP z powodu ReadLine, postępuj zgodnie z instrukcjami w Nie można zaktualizować lub użyć menedżera pakietów - błąd gpg :

W terminalu:

ls /usr/local/lib

było tam wiele bibliotek readline (libreadline.so.BLAH-BLAH), więc:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig
jww
źródło
2

Powyższe odpowiedzi są świetne, ale dla mnie nie zadziałały. Rozwiązaniem mojego problemu było wyeksportowanie zarówno kluczy publicznych, jak i tajnych .

wypisz klucze z komputera, z którego eksportujemy

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

eksportuj klucze

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

przejdź do maszyny, do której importujemy i importujemy

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

bingo bongo, gotowe!

odniesienie: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

ps. Moje klucze zostały pierwotnie wykonane w systemie Windows 7 Bootcamp i wyeksportowałem je na Mac Mac Air (ta sama fizyczna maszyna, inna wirtualnie)

asus
źródło
2

Jestem na Ubuntu 18.04 i dostałem ten sam błąd, martwiłem się także przez tygodnie. Wreszcie zdałem sobie sprawę, że gpg2 nie wskazuje na nic. Po prostu biegnij

git config --global gpg.program gpg

I tada, działa jak urok.

Podpisano zatwierdzenie

Twoje zatwierdzenia będą teraz weryfikować przy użyciu tagu.

Aashutosh Rathi
źródło
2

Natknąłem się na ten błąd nie z powodu problemów z konfiguracją, ale dlatego, że mój klucz wygasł. Najłatwiejszym sposobem przedłużenia ważności w OSX jest otwarcie aplikacji pęku kluczy GPG (jeśli masz ją zainstalowaną) i automatycznie poprosi o jej przedłużenie. Dwa kliknięcia i gotowe. Mam nadzieję, że pomaga to innym pracownikom Google :)

maxhm10
źródło
2

To zaczęło się dla mnie nagle pojawiać na Ubuntu, nie jestem pewien, czy zrobiła to ostatnia aktualizacja, ale żaden z istniejących problemów mnie nie dotyczył ( GPG_TTYustawiłem, próbowałem zabić agenta itp.). Samodzielne gpgpolecenie zakończyło się niepowodzeniem z powodu tego błędu:

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

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

Próbowałem uruchomić gpgz --debug-allopcją i zauważyłem poniższy wynik:

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

Powyższe wskazuje, że jest jakiś problem z pinentryprogramem. Gpg normalnie działa pinentry-cursesdla mnie, więc zmieniłem go na pinentry-tty(musiałem aptitude installto najpierw) i błąd zniknął (chociaż nie otrzymuję już hasła do pełnego ekranu, ale i tak mi się nie podoba). Aby dokonać tej zmiany, musiałem dodać linię pinentry-program /usr/bin/pinentry-ttydo ~/.gnupg/gpg-agent.confi zabić agenta z gpgconf --kill gpg-agent(robi wznowiona następnym razem).

haridsv
źródło
1

Żadna z powyższych odpowiedzi nie pasowała do mojego problemu. Mój gpgplik binarny ( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) został zainstalowany jako część pakietu GPG , a nie przez brew.

Niemniej jednak czułem, że rada sprowadza się do: „używaj dowolnego pliku gpgbinarnego, który jest najnowszym dostępnym w parzeniu”. Więc próbowałem:

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

Potwierdziłem, że poprawnie zmieniłem gpgmój, $PATHaby wskazać nowy plik wykonywalny z 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

I również wyraźnie powiedziałem git, którego pliku gpgbinarnego użyć:

git config --global gpg.program gpg

Cóż, może nie jest to całkowicie wodoszczelne, ponieważ jest wrażliwe na ścieżkę. Właściwie nie posunąłem się aż tak daleko, by potwierdzić ponad wszelką wątpliwość, że git przeszedł na inwokowanie naparu gpg.

W każdym razie: nic z tego nie wystarczyło, aby git commitpomyślnie podpisać moje zobowiązania.


Ostatecznie działała dla mnie aktualizacja GPG Suite . Korzystałem z wersji 2016.7 i stwierdziłem, że aktualizacja do 2016.10 rozwiązała problem.

Otworzyłem GPG Keychain.appi nacisnąłem „Sprawdź aktualizacje…”. W nowej wersji: podpisane zatwierdzenia znów działały poprawnie.

Brzozy
źródło
Próbowałem zaktualizować do najnowszej wersji ... to też nie działało. próba zalogowania się xcode.
Albert T. Wong
1

skonfigurowałem po prostu:

brew uninstall gpg 

brew install gpg2
Anurag pareek
źródło
1

Bardzo podobnie jak @birchlabs, po wielu kopaniach / poszukiwaniach odkryłem, że to nie GPG, a raczej GPG Suite. Zrobiłem to cask reinstall gpg-suitei dla mnie to rozwiązało.

Jan
źródło
0

Jeśli zdarzyło się to losowo i działało doskonale w przeszłości, tak jak w moim przypadku, spróbuj wylogować się ( cmd+shift+q) i zalogować ponownie. Pracowałem dla mnie

Skylar Brown
źródło
0

W moim przypadku żadne z rozwiązań wymienionych w innej odpowiedzi nie zadziałało. Dowiedziałem się, że problem dotyczy jednego repozytorium. Ponowne usunięcie i klonowanie repozytorium rozwiązało problem.

David Miguel
źródło
0

To trochę dziwne, ale upewnij się, że twój terminal jest wystarczająco duży! Możesz stwierdzić, czy jest za mały, uruchamiającecho test | gpg --clearsign - wyświetli dość oczywisty komunikat o błędzie, informujący o tym. Jeśli nie jest wystarczająco duży, Twój agent GPG nie może wyświetlić swojego małego pola ncurses.

Ten nie będzie obowiązywał, jeśli używasz agenta GUI lub czegoś, co nie używa ncurses.

Powództwo Fund Moniki
źródło