Błąd Git - GPG nie może podpisać danych


149

Właśnie zacząłem używać git i instaluję git i gpg przez homebrew. Z jakiegoś powodu pojawia się ten błąd, gdy git commit spojrzałem na tak wiele innych pytań dotyczących tego tematu i żadne z nich nie zadziałało. Jak mogę naprawić ten błąd, aby móc pomyślnie przesłać.

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

3
Dla użytkowników komputerów Mac. Miałem ten problem. Porady na tej stronie pomogły mi zdać sobie sprawę, że mogę mieć zainstalowane dwie wersje gpg i tak zrobiłem. Jeden z brew i jeden z GPG Suite. Chciałem użyć pakietu GPG, ponieważ pozwala on na buforowanie hasła w pęku kluczy systemowych. Odinstalowanie wersji brew rozwiązało moje problemy. Wraz z odpowiedzią @sidehowbarker na temat zabijania agenta gpg. Zakładam więc, że konfiguracje każdego z nich przeszkadzały sobie nawzajem.
Michael Welch



Właśnie napotkałem problem z podpisywaniem gpg, problem polegał na tym, że moje repozytorium git nie miało swojego lokalnego zestawu gpg.signingkey, ale globalny był. Po prostu ustaw git config --local user.signingkeywłaściwy klucz, a zostanie ponownie automatycznie podpisany. i może git config --global --unset user.signingkey
rozbroić

Odpowiedzi:


210

Aby rozwiązać problem, najpierw spróbuj dwóch rzeczy:

  • run git config --global gpg.program gpg2, aby upewnić się, że git używa, gpg2a niegpg
  • uruchomić echo "test" | gpg2 --clearsign, aby upewnić gpg2się, że działa

Jeśli wszystko wygląda dobrze, spróbuj jeszcze jednej rzeczy:

  • uruchom, brew install pinentryaby upewnić się, że masz zainstalowane dobre narzędzie do wprowadzania hasła

Jeśli po tej instalacji i ponownej próbie git commitnadal pojawia się failed to sign the databłąd „ ”:

  • uruchomić, gpgconf --kill gpg-agentaby zabić uruchomionego agenta, który mógł zostać zawieszony

Jeśli mówi, że gpgconfnie jest zainstalowana lub nie ma --killopcji, może spróbuj tego:

  1. cp ~/.gnupg ~/.gnupg-GOODaby zapisać kopię swojego konta, ~/.gnupgaby w razie potrzeby powrócić do później
  2. brew install gnupg21 aby zainstalować GnuPG 2.1

Powodem zapisania kopii ~/.gnupgkatalogu jest to, że GnuPG 2.1 potencjalnie tworzy / zmienia niektóre kluczowe dane w sposób, który nie jest wstecznie kompatybilny z GnuPG 2.0 i wcześniejszymi, więc jeśli chcesz wrócić później, możesz to zrobić mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


W przeciwnym razie należy wykonać kilka podstawowych czynności, aby sprawdzić, czy masz działające środowisko GnuPG:

  • uruchom gpg2 -K --keyid-format SHORT, aby sprawdzić, czy masz co najmniej jedną parę kluczy

Jeśli wynik tego pokaże, że nie masz tajnego klucza do użycia przez GnuPG, musisz go utworzyć:

  • uruchom gpg2 --gen-key, aby GnuPG przeprowadził Cię przez kolejne etapy tworzenia pary kluczy

Jeśli pojawi się komunikat o błędzie „Nieodpowiedni ioctl dla urządzenia” , zrób tak:

  • uruchom export GPG_TTY=$(tty)i / lub dodaj to do swojego ~/.bashrclub˜/.bash_profile

Otrzymuję ten błąd, gdy uruchamiam drugie polecenie: gpg: brak domyślnego klucza tajnego: brak tajnego klucza gpg: [stdin]: wyczyszczenie nie powiodło się: brak tajnego klucza
Uprawnij

@Entitize To wydaje się wskazywać, że gpg nie myśli, że masz jakieś klucze do podpisania. Zobacz dodatkowe kroki, które dodałem do odpowiedzi; jeśli nigdy wcześniej nie biegałeś gpg2 --gen-key, to musisz zrobić najpierw.
sideshowbarker

2
kiedy uruchamiam echo "test" | gpg2 --clearsign, daje mi: gpg-agent [-]: polecenie get_passphrase nie powiodło się: Niewłaściwy ioctl dla urządzenia gpg: problem z agentem: Niewłaściwy ioctl dla urządzenia gpg: brak domyślnego klucza tajnego: Operacja anulowana gpg: [stdin]: clearsign nie powiodło się: operacja anulowana. Próbowałem tylu innych możliwości, ale żadna nie działa. Czy istnieje sposób korzystania z GIT bez GPG!
Skorzystaj z

9
Możesz spróbować export GPG_TTY=$(tty). O ile istnieje sposób na użycie git bez gpg, powinieneś być w stanie to zrobić domyślnie lub po prostu uruchamiając git config --global commit.gpgsign falseglobalnie cofnięte podpisywanie zatwierdzeń przez gpg.
sideshowbarker

10
Tutaj w systemie Mac OS X zacząłem debugować echo "test" | gpg2 --clearsign, znalazłem błąd i prowadzi mnie do tego wątku , który rozwiązał mój problem: po prostu włożyłem export GPG_TTY=$(tty)do mojego ˜/.bash_profilepliku i ponownie załadowałemsource ˜/.bash_profile
herrera

71

Git musi wiedzieć, którym kluczem się podpisuje.

Po skonfigurowaniu plików GPG, gpg-agent i plików gpg.conf (zobacz ten przewodnik ), musisz uruchomić

git config --global user.signingkey EB11C755

Oczywiście zamień na koniec klucz publiczny swoim własnym. Jeśli chcesz, aby każde zatwierdzenie było domyślnie podpisywane, użyj

git config --global commit.gpgsign true

7
Po prostu natknąłem się na to na wypadek, gdyby ktoś inny był na tyle głupi, by zrobić to, co ja: Upewnij się, że przeliterujesz to „klucz podpisu”, a nie „signinkey”.
ZNK

1
dosłownie ten komentarz @ZNK zrobił to za mnie. Napisałem to „signkey” zamiast „signingkey”
jzatt

1
Przyjęta odpowiedź powinna zacytować to jako pierwszy krok rozwiązywania problemów, ponieważ czasami wszystkie klucze są już na miejscu, po prostu git zapomina, którego klucza użyć.
f055

41

W jakiś sposób twój git jest skonfigurowany do podpisywania każdego zatwierdzenia przez GPG. Podpisywanie za pomocą GPG nie jest wymagane do zatwierdzania lub wypychania za pomocą git. Prawdopodobnie powoduje to błąd, ponieważ Twój mechanizm podpisywania gpg nie jest jeszcze skonfigurowany.

Jeśli jesteś nowy w git, spróbuj najpierw uruchomić go bez podpisywania GPG, a następnie dodaj logowanie później, jeśli naprawdę tego potrzebujesz.

Możesz sprawdzić, jak Twój git jest skonfigurowany w odniesieniu do gpg, wykonując:

git config -l | grep gpg

Które mogą generować zero lub więcej linii, w tym:

commit.gpgsign=true

Jeśli „commit.gpgsign” ma wartość true, oznacza to, że masz włączone podpisywanie gpg. Wyłącz to za pomocą:

git config --global --unset commit.gpgsign

Następnie spróbuj ponownie uruchomić zatwierdzenie. Powinien teraz działać bez podpisywania gpg. Po uzyskaniu podstawowego działania gita, powinieneś spróbować dodać podpisywanie gpg z powrotem do miksu.


12
Niesamowite! git config --global --unset commit.gpgsignpracował dla mnie :)
hpaknia

łał!! dla mnie zadziałało: git config --global --unset commit.gpgsign
Hardy Mathew

32

Zapoznaj się z @sideshowbarker i rozwiązaniem @Xavier Ho, rozwiązałem mój problem, wykonując następujące kroki.

Załóżmy, że gpg2 zainstalowany przez 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] [wygasa: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Przypomniał mi kolega, trzeba dołączyć

export GPG_TTY=$(tty)

do ~ / .zshrc, jeśli używasz zsh, w przeciwnym razie dołącz do ~ / .bash_profile


W przypadku systemu macOS

gpg2 jest połączone z gpg w brew, stąd polecenie gpg jest skierowane do gpg2

brew install gpg2

napar info gpg

gnupg: stabilny 2.2.6 (butelkowy)

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

i jest pinentry-mac do wpisywania hasła

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

Dodaj linię

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

Przypomniał mi kolega, trzeba dołączyć

export GPG_TTY=$(tty)

do ~ / .zshrc, jeśli używasz zsh, w przeciwnym razie dołącz do ~ / .bash_profile


1
macOS 10.15 (Catalina) jest dostarczany z GnuPG w wersji 2.2.17, więc nie ma potrzeby instalowania go osobno, chyba że planujesz samodzielnie zarządzać aktualizacjami.
Josh Habdas

18

Używam tego. Obsługuje zsha i działa na podsystemie Windows dla systemu Linux:

export GPG_TTY=$(tty)

2
Używam zsh na MacOS Catalina i była to jedyna zmiana, jakiej potrzebowałem, aby to zadziałało. Dzięki.
JP Lew

Otrzymałem błąd w OP po skopiowaniu moich kluczy do mojego środowiska WSL, okazało się, że musiałem to zrobić, aby wyświetlić monit o hasło do klucza. Dzięki.
narwic

10

Sprawdź, czy Twój klucz wygasł. Po ustaleniu daty ważności (nie ma potrzeby tworzenia nowego klucza, chyba że chcesz), gitbędzie działać normalnie.

Jeden ze sposobów naprawienia wygasłego klucza:

(Uwaga: $reprezentuje wiersz polecenia, wpisz polecenia po monicie; naciśnij klawisz Enter po każdym poleceniu)

$ gpg2 --list-keysaby znaleźć odpowiedni identyfikator klucza (po znaków \na publinię)

$ gpg2 --edit-key <key id> - to otwiera powłokę gpg ze zmianą znaku zachęty na gpg>

gpg> expire - postępuj zgodnie z instrukcjami, aby ustawić nową datę ważności klucza podstawowego

Następnie, jeśli istnieją podklucze, które wygasły (są subwyświetlane w wierszu), zresetuj również ich daty wygaśnięcia:

gpg> key 1- wybiera pierwszy podklucz gpg> expire- postępuj zgodnie z instrukcjami, aby ustawić nową datę ważności dla podklucza

W razie potrzeby powtórz dla każdego kolejnego podklucza.


Miałem ten problem za każdym razem, gdy próbowałem uruchomić klucz gpg, który nie miał daty ważności. Z jakiegoś powodu gitowi się to nie podoba. Wydaje się, że użycie tej metody do dodania daty wygaśnięcia (bez względu na to, jak daleko w przyszłości) rozwiązuje problem.
some_guy632

Nie zapomnij wpisać savew zachęcie gpg, kiedy skończysz!
daviewales

5

To działało dla mnie na ubuntu 18.04

Sprawdź swój klucz gpg

gpg -K --keyid-format LONG

jeśli otrzymasz pustą odpowiedź, wygeneruj klucz GPG

gpg --generate-key

uruchom ponownie pierwszą komendę, powinieneś otrzymać wynik jako:

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]

ustaw klawisz śpiewania git

git config --global user.singingkey 95A854E0593B3214

więc jesteś gotowy! (--global jest opcjonalne)

Alternatywnie, jeśli nie masz nic przeciwko podpisywaniu się za pomocą klucza SSH

git config commit.gpgsign false

Zwróć uwagę, że nie jest to zalecane ze względu na problem z bezpieczeństwem, zgodnie z tym pytaniem tutaj i tutaj


„Alternatywnie, jeśli nie masz nic przeciwko podpisywaniu się kluczem SSH”, co ma wspólnego ssh z podpisywaniem?
riffraff

SSH nie ma nic wspólnego z podpisywaniem zatwierdzeń. Odnoszą się do wyłączenia podpisywania zatwierdzeń GPG i polegania na używaniu kluczy SSH do uwierzytelniania, kiedy faktycznie wysyłasz swoje zatwierdzenia do serwera git. Możesz push (i jest to dość powszechne), aby wypychać niepodpisane zatwierdzenia przy użyciu uwierzytelniania SSH.
phouse512

4

Musiałem naprawić gpg.program na ścieżkę bezwzględną do gpg:

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

Używam systemu Windows z cygwin.


3
To było dla mnie rozwiązanie. Zainstalowałem gnupg przy użyciu chocolatey.
Alex S

Dzięki, dla mnie też pracował. Zrobiłemchoco install gpg4win
Gokul NC

4

Rozwiązanie:

Issue: Disabled loopback pinentry mode

Aby rozwiązać problem, musisz włączyć tryb pinentry loopback w ~ / .gnupg / gpg.conf :

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

use-agent 
pinentry-mode loopback

EOF

A także w ~ / .gnupg / gpg-agent.conf (utwórz plik, jeśli jeszcze nie istnieje):

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

allow-loopback-pinentry

EOF

Następnie zrestartuj agenta za pomocą echo RELOADAGENT | gpg-connect-agenti powinieneś być gotowy!

Źródło


1
Wow, po spędzeniu wielu godzin na próbowaniu wszystkich możliwych rozwiązań, to rozwiązało mój problem, dzięki!
Matt

Nie ma za co. Właściwie dzięki źródłu. Ja też z tym utknąłem.
Rahul Thakur

3

Ten błąd może również wystąpić, gdy wygasła ważność klucza GPG. Wygenerowanie nowego klucza i dodanie go do Git powinno rozwiązać ten problem.


3

Wystąpił ten problem po aktualizacji do gnupg 2.x. Okazało się, że gpg2 odwołuje się do kluczy w inny sposób: nadal miałem signingkey = ABC98F11(ustawienie gpg v1) w pliku ~/.gitconfig. Kluczowe identyfikatory dla gpg2 są dłuższe. Wyszukaj je za pomocągpg --list-secret-keys


1

Zrobiłem gitklucz z 3 oddzielnymi kluczami dla certify/ sign/ encrypti klucz pokazał, że wygasł w przyszłości (po kilku dniach pracy dobrze):

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     ]

utworzono nowy klucz bez dodawania oddzielnych podkluczy w celu rozwiązania problemu.


1

Być może Twoja konfiguracja Gita została ustawiona na gpgsign = true . Spróbuj ustawić to na false, jeśli nie chcesz przypisywać swoich zatwierdzeń. Przejdź do folderu repozytorium i zmień plik

nano .git / config

Od tego...

[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

Do tego...

[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

Dla mnie ten błąd zaczął wystąpić git tag -sna Debian GNU / Linux, gdy przeszedłem od pinentry-gnome3do pinentry-curses(za pomocą update-alternatives --config pinentry) dla łatwiejszego dostępu zdalnego. Wystąpiło tylko z samym sobą git tag -s, a nie gpg(np. gpg --clearsign).

Jedyną zmianą niezbędną do przywrócenia działania w tym przypadku było dodanie export GPG_TTY=$(tty)do moich plików startowych powłoki.

Nie otrzymałem jednak komunikatu o błędzie „Nieodpowiedni ioctl dla urządzenia” wymienionego jako wskaźnik tej poprawki w innej odpowiedzi na to pytanie.

Uwaga: Ponieważ przyczyna pojawienia się tego błędu była zupełnie inna niż w przypadku tych, którzy zasugerowali export GPG_TTY=$(tty)wcześniej (zwykle jako poboczna wskazówka) w innych odpowiedziach na to pytanie, zdecydowałem, że to pytanie wymaga innej odpowiedzi, która wspomina, że export GPG_TTY=$(tty)może to być główna poprawka i jedyna rzecz niezbędna w niektórych przypadkach.


Dzięki! update-alternatives --config pinentryzrobił to dla mnie. Jestem SSH na moim pulpicie i zostałem pinentryustawiony na /usr/bin/pinentry-gnome3(co powinno mieć rezerwę TTY po SSH w lub po przełączeniu na konsolę wirtualną). Ale najwyraźniej nie działało. Ustawienie wartości domyślnej /usr/bin/pinentry-ttyzałatwiło sprawę. Być może będę musiał to ustawić z powrotem, gdy wrócę do pulpitu, ale na razie wszystko jest w porządku. export GPG_TTY=$(tty)nie wystarczyło. Zrobiłem to, ale musiałem się przełączyć, pinentryzanim mogłem podpisać zobowiązanie.
Karl Wilbur

1

Rozwiązaniem tego problemu było upewnienie się, że nazwa klucza jest zgodna z moją nazwą użytkownika git. Zakładam, że e-maile też muszą się zgadzać. Może to mieć związek z używaniem GPG KeyChain na moim Macu. Niepewny.

Myślałem, że nazywam klucz, kiedy to wypełniałem, ale wydaje mi się, że pytałem o moje imię (nazwa użytkownika git).

Formularz pęku kluczy GPG


Szkoda, że ​​ta odpowiedź jest tak daleko w tyle, że wielu nie dotrze tutaj, szukając swojego problemu.
MaciekS

1

Miałem ten błąd na macos - aby spróbować rozwiązać problem, próbowałem wyświetlić listę kluczy, aby sprawdzić, czy wygasły przy użyciu gpg2 --list-keys- sprawdziłem, że klucze nie wygasły i że właściwy klucz został ustawiony w mojej konfiguracji przy użyciu git config --global user.signingkey.

Po uruchomieniu tych poleceń nagle mogłem bez problemu ponownie wykonywać podpisane zatwierdzenia. Nie zmieniłem swoich plików konfiguracyjnych ani kluczy - nie utworzyłem nawet nowej instancji Terminala. Wyglądało na to, że gpg2 był w jakimś dziwnym stanie na moim Macu.


0

Rozwiązałem problem z instalacją, brew install gpg2a potem robiłemgit config --global gpg.program gpg2


0

Ten sam błąd może być również spowodowany utratą ważności klucza w konfiguracji git.

Sprawdź zawartość cat .git/configi poszukaj signingkeywartości i sprawdź, czy wygasła. Jeśli tak, zaktualizuj go nowym.


0

Jeśli używasz karty inteligentnej / yubikey do przechowywania klucza GPG i ustawisz signkeykonfigurację git za pomocą klucza przechowywanego na karcie (a wszystkie powyższe odpowiedzi wydają się nie rozwiązać problemu), zablokowany kod PIN karty może być główna przyczyna tego problemu.

Aby sprawdzić zablokowany kod PIN:

gpg --card-status

Jeśli licznik jest podobny do

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

Następnie Twój PIN jest blokowany (po 3 nieudanych próbach).

Aby odblokować kod 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

Dla mnie proste brew unintstall gnupg && brew cask reinstall gpg-suiterozwiązanie problemu.

Odinstalowuje (w moim przypadku) ręcznie homebrew-istalled gpg i ponownie instaluje cały pakiet GPG.


0

W moim przypadku miałem mieszaną konfigurację gpg i konfigurację smimesign podaną w dokumentacji podpisywania zmian tutaj: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- klucz

Po kilku godzinach pracy nad tym znalazłem najlepszy sposób na naprawienie tego, że wszystko związane z gpg jest wyłączone i rekonfiguracja gpg.

Jak wspomniano w odpowiedzi @Jason Thrasher, znajdź całą konfigurację git związaną z gpg za pomocą:

git config -l | grep gpg

Następnie wyłącz wszystko golablly i lokalnie za pomocą:

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

Następnie skonfiguruj ponownie zgodnie z oficjalną dokumentacją podaną powyżej. Mam nadzieję że to pomoże.


Ponadto używam gpg2
Shubham Gupta

0

Jeśli wcześniej skonfigurowałeś pinentry i gpg i przestało działać znikąd:

Sprawdź, czy twój gpg działa:

echo "test" | gpg --clearsign

Jeśli tak gpg: signing failed: No pinentry, po prostu zrestartuj klienta demona gpg, który od czasu do czasu zacina się:

gpgconf --kill gpg-agent

Teraz powinno działać:

echo "test" | gpg --clearsign

0

W moim przypadku ten błąd wystąpił podczas uruchamiania git commitw małym tmuxoknie, które nie było w stanie dopasować się do monitu o hasło.

$ 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

To pomoże ci się go pozbyć

git config commit.gpgsign false


1
Nie rozumiem głosowania przeciw, rozwiązało to proponowaną kwestię jak urok dla mnie.
Jms

2
Tego polecenia należy unikać. Usunie tylko wymóg podpisania zobowiązania, a nie rozwiąże problemu uwierzytelnienia osoby, która dokonuje zobowiązania.
Kyle
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.