Errore Git - gpg non è riuscito a firmare i dati


149

Ho appena iniziato a usare git e installo git e gpg tramite homebrew. Per qualche motivo, ricevo questo errore quando lo faccio git commit ho visto tante altre domande di stackoverflow relative a questo argomento e nessuna di queste ha funzionato per me. Come posso correggere questo errore in modo da poter caricare correttamente.

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

3
Per utenti Mac. Ho avuto questo problema. I consigli su questa pagina mi hanno aiutato a capire che potrei avere due versioni di gpg installate e l'ho fatto. Uno da birra e uno da GPG Suite. Volevo usare GPG Suite one poiché consente di memorizzare la passphrase nel portachiavi di sistema. La disinstallazione della versione brew ha risolto i miei problemi. Insieme alla risposta di @ sideshowbarker sull'uccisione dell'agente gpg. Quindi presumo che le configurazioni di ciascuno interferissero l'una con l'altra.
Michael Welch,



Ho appena riscontrato un problema con la firma gpg, il problema era che il mio repository git non aveva il set gpg.signingkey locale, ma lo era gllobal. Quindi basta impostare git config --local user.signingkeyla chiave corretta e si assegnerà di nuovo automaticamente. e forse disinserire quello globale congit config --global --unset user.signingkey
MarcusJ

Risposte:


210

Per la risoluzione dei problemi, due cose da provare prima:

  • eseguire git config --global gpg.program gpg2, per assicurarsi che Git usi gpg2e nongpg
  • correre echo "test" | gpg2 --clearsign, per assicurarsi che gpg2si sta lavorando

Se tutto sembra a posto, una prossima cosa da provare:

  • eseguire brew install pinentryper assicurarsi di avere un buon strumento installato per l'immissione della passphrase

Se dopo l'installazione e riprovi git commite ottieni ancora l' failed to sign the dataerrore " ":

  • correre gpgconf --kill gpg-agentper uccidere qualsiasi agente in esecuzione che potrebbe essere impiccato

Se questo dice che gpgconfnon è installato o non ha --killun'opzione, potresti provare questo:

  1. cp ~/.gnupg ~/.gnupg-GOODper salvare una copia del tuo ~/.gnupgper tornare in un secondo momento, se necessario
  2. brew install gnupg21 per installare GnuPG 2.1

La ragione per salvare una copia della tua ~/.gnupgdirectory è che GnuPG 2.1 crea / modifica potenzialmente alcuni dati chiave in un modo che non è retrocompatibile con GnuPG 2.0 e precedenti, quindi se vuoi tornare indietro, puoi farlo mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


Altrimenti ci sono alcuni passaggi di base da eseguire per verificare che tu abbia un ambiente GnuPG funzionante:

  • esegui gpg2 -K --keyid-format SHORT, per verificare che tu abbia almeno una coppia di chiavi

Se l'output di ciò mostra che non hai una chiave segreta da utilizzare per GnuPG, devi crearne una:

  • eseguire gpg2 --gen-key, per fare in modo che GnuPG ti guidi attraverso i passaggi per la creazione di una coppia di chiavi

Se viene visualizzato un messaggio di errore che dice "Ioctl inappropriato per dispositivo" , procedere come segue:

  • esegui export GPG_TTY=$(tty)e / o aggiungilo al tuo ~/.bashrco˜/.bash_profile

Ottengo questo errore quando eseguo il secondo comando: gpg: nessuna chiave segreta predefinita: nessuna chiave segreta gpg: [stdin]: clearsign non riuscito: nessuna chiave segreta
Autorizza il

@Entitize Questo sembra indicare che gpg non pensa di avere alcuna chiave da usare per la firma. Vedi i passaggi aggiuntivi che ho aggiunto alla risposta; se non hai mai corso gpg2 --gen-keyprima, è quello che devi fare prima.
sideshowbarker,

2
quando eseguo echo "test" | gpg2 --clearsign, mi dà: gpg-agent [-]: comando get_passphrase non riuscito: ioctl inappropriato per il dispositivo gpg: problema con l'agente: ioctl inappropriato per il dispositivo gpg: nessuna chiave segreta predefinita: operazione annullata gpg: [stdin]: clearsign fallito: operazione annullata. Ho provato tante altre possibilità, ma nessuna funziona. C'è un modo per usare GIT senza GPG!
Autorizza il

9
Potresti provare export GPG_TTY=$(tty). Per quanto ci sia un modo per usare git senza gpg, dovresti essere in grado di farlo di default o semplicemente correndo git config --global commit.gpgsign falseper annullare la firma gpg a livello globale dei tuoi commit.
sideshowbarker,

10
Qui in Mac OS X, ho iniziato a eseguire il debug, ho echo "test" | gpg2 --clearsigntrovato un errore e questo mi porta a questo thread , che ha risolto il mio problema: ho appena inserito un file export GPG_TTY=$(tty)nel mio ˜/.bash_profilefile e poi ricaricato consource ˜/.bash_profile
herrera il

71

Git deve sapere con quale chiave sta firmando.

Dopo aver installato GPG, gpg-agent e i file gpg.conf (consultare questa guida ), è necessario eseguire

git config --global user.signingkey EB11C755

Ovviamente, sostituisci la chiave pubblica alla fine con la tua. Se si desidera che ogni commit sia firmato per impostazione predefinita, utilizzare

git config --global commit.gpgsign true

7
Mi sono appena imbattuto nel caso in cui qualcun altro fosse abbastanza sciocco da fare quello che ho fatto: assicurati di scrivere "signingkey" e non "signinkey".
ZNK

1
letteralmente questo commento di @ZNK lo ha fatto per me. L'avevo scritto "chiave di segno" anziché "chiave di segno"
jzatt il

1
La risposta accettata dovrebbe citare questo come il primo passo per la risoluzione dei problemi, perché a volte hai già tutte le chiavi in ​​atto, è solo git che dimentica quale chiave usare.
f055,

41

In qualche modo il tuo git è configurato per firmare GPG ad ogni commit. Non è necessario firmare con GPG per eseguire il commit o il push usando git. Probabilmente sta dando l'errore perché il tuo meccanismo di firma gpg non è ancora configurato.

Se non hai familiarità con Git, prova a farlo funzionare prima senza GPG all'inizio, quindi aggiungi l'accesso in seguito se ne hai davvero bisogno.

Puoi verificare come è configurato il tuo git per quanto riguarda gpg facendo:

git config -l | grep gpg

Che può produrre zero o più righe, tra cui:

commit.gpgsign=true

Se "commit.gpgsign" è true, allora hai abilitato la firma gpg. Disabilita con:

git config --global --unset commit.gpgsign

Quindi prova a eseguire nuovamente il commit. Ora dovrebbe funzionare senza firma gpg. Dopo aver fatto funzionare git di base, allora dovresti provare ad aggiungere la firma gpg al mix.


12
Eccezionale! git config --global --unset commit.gpgsignha funzionato per me :)
hpaknia,

Wow!! ha funzionato per me: git config --global --unset commit.gpgsign
Hardy Mathew

32

Fare riferimento a @sideshowbarker e alla soluzione @Xavier Ho, ho risolto il mio problema seguendo i passaggi seguenti.

Supponiamo che gpg2 sia installato da 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] [scade: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Ricordato dal mio collega, devo aggiungere

export GPG_TTY=$(tty)

a ~ / .zshrc se si utilizza zsh, altrimenti aggiungere a ~ / .bash_profile


Per macOS,

gpg2 è combinato con gpg in brew e quindi il comando gpg è puntato su gpg2

brew install gpg2

info birra gpg

gnupg: stabile 2.2.6 (imbottigliato)

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

e c'è pinentry-mac per la voce passphrase

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

Aggiungi linea

programma pinentry / usr / local / bin / pinentry-mac

Ricordato dal mio collega, devo aggiungere

export GPG_TTY=$(tty)

a ~ / .zshrc se si utilizza zsh, altrimenti aggiungere a ~ / .bash_profile


1
macOS 10.15 (Catalina) viene fornito con GnuPG versione 2.2.17, quindi non è necessario installarlo separatamente a meno che non si pianifichi di gestire gli aggiornamenti da soli.
Josh Habdas,

18

Lo sto usando. Ha il supporto per zsha e funziona sul sottosistema Windows per Linux:

export GPG_TTY=$(tty)

2
Sto usando zsh su MacOS Catalina e questa è stata l'unica modifica di cui avevo bisogno per farlo funzionare. Grazie.
JP Lew

Stavo ricevendo l'errore nell'OP dopo aver copiato le mie chiavi nel mio ambiente WSL, risulta che avevo bisogno di fare questo per fornire un prompt per la passphrase sulla chiave. Grazie.
narwic,

10

Verifica che la chiave sia scaduta. Dopo aver corretto la data di scadenza (non è necessario creare una nuova chiave a meno che non si desideri), gitfunzionerà normalmente.

Un modo per correggere la chiave scaduta:

(Nota: $rappresenta il prompt della riga di comando, digitare i comandi dopo il prompt; premere Invio dopo ciascun comando)

$ gpg2 --list-keysper trovare l'id chiave appropriato (caratteri dopo \in publinea)

$ gpg2 --edit-key <key id> - questo apre la shell gpg, con prompt modificato in gpg>

gpg> expire - seguire le istruzioni per impostare la nuova data di scadenza per la chiave primaria

Quindi, se ci sono sottochiavi che sono scadute ( submostra sulla linea), reimpostare anche le loro date di scadenza:

gpg> key 1 - seleziona la prima sottochiave gpg> expire - segui le istruzioni per impostare una nuova data di scadenza per la sottochiave

Ripetere l'operazione per ogni sottochiave successiva, se necessario.


Ho avuto questo problema ogni volta che ho provato a eseguire una chiave gpg che non aveva una data di scadenza. Per qualche ragione a Git non piace. L'uso di questo metodo per aggiungere una data di scadenza (non importa quanto lontano in futuro) sembra risolvere il problema.
some_guy632,

Non dimenticare di digitare saveal prompt di gpg quando hai finito!
daviewales,

5

Questo ha funzionato per me su Ubuntu 18.04

Controlla la tua chiave gpg

gpg -K --keyid-format LONG

se ottieni una risposta vuota, genera una chiave GPG

gpg --generate-key

riesegui il primo comando, dovresti ottenere un output come:

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]

imposta chiave di canto git

git config --global user.singingkey 95A854E0593B3214

allora sei a posto! (--global è facoltativo)

In alternativa, se non ti dispiace firmare con il tasto SSH

git config commit.gpgsign false

si noti che questo non è raccomandato a causa di un problema di sicurezza secondo questa domanda qui e qui


"In alternativa, se non ti dispiace firmare con la tua chiave ssh" cosa c'entra ssh con la firma?
riffraff,

SSH non ha nulla a che fare con la firma di commit. Si riferiscono alla disattivazione della firma di commit GPG e all'utilizzo delle chiavi SSH per l'autenticazione quando si esegue effettivamente il push dei commit su un server git. Puoi spingere (ed è abbastanza comune) spingere commit senza segno usando l'autenticazione SSH.
phouse512

4

Ho dovuto correggere il programma gpg. sul percorso assoluto di gpg:

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

Sto usando Windows con Cygwin.


3
Questa è stata la soluzione per me. Ho installato gnupg usando chocolatey.
Alex S,

Grazie, ha funzionato anche per me. Avevo fattochoco install gpg4win
Gokul NC

4

Soluzione:

Issue: Disabled loopback pinentry mode

Per risolvere il problema, è necessario abilitare la modalità pinentry loopback in ~ / .gnupg / gpg.conf :

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

use-agent 
pinentry-mode loopback

EOF

E anche in ~ / .gnupg / gpg-agent.conf (crea il file se non esiste già):

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

allow-loopback-pinentry

EOF

Quindi riavvia l'agente con echo RELOADAGENT | gpg-connect-agente dovresti essere a posto!

fonte


1
Caspita, dopo aver passato ore a provare tutte le possibili soluzioni, questo ha risolto il mio problema, grazie!
Matt

Prego. Grazie alla fonte in realtà. Ero bloccato anche con questo.
Rahul Thakur,

3

Questo errore può verificarsi anche quando la chiave GPG è scaduta. Generare una nuova chiave e aggiungerla a Git dovrebbe risolverlo.


3

Ho riscontrato questo problema dopo l'aggiornamento a gnupg 2.x. Vedrebbe che gpg2 fa riferimento in modo diverso alle chiavi: avevo ancora signingkey = ABC98F11(impostazione gpg v1) nel mio ~/.gitconfig. Gli identificatori chiave per gpg2 sono più lunghi. Guardali congpg --list-secret-keys


1

Avevo creato una gitchiave con 3 chiavi separate per certify/ sign/ encrypte la chiave mostrata come scaduta in futuro (dopo aver lavorato bene per alcuni giorni):

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     ]

ha creato una nuova chiave senza aggiungere sottochiavi separate per risolvere il problema.


1

Può essere che la tua configurazione Git sia stata impostata gpgsign = true . Prova a impostarlo su false se non vuoi assegnare i tuoi commit. Vai alla cartella del tuo repository e modifica il file

nano .git / config

Da questa...

[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

A questa...

[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

Per me questo errore ha cominciato a verificarsi con git tag -ssu Debian GNU / Linux quando sono passato da pinentry-gnome3a pinentry-curses(usando update-alternatives --config pinentry) per facilitare l'accesso remoto. Si è verificato solo con git tag -s, non con gpg(ad esempio gpg --clearsign) stesso.

L'unica modifica necessaria per farlo funzionare di nuovo in questo caso è stata l'aggiunta export GPG_TTY=$(tty)ai miei file di avvio della shell.

Tuttavia, non ho ricevuto il messaggio di errore "Inappropriato ioctl per dispositivo" menzionato come indicatore per questa correzione in un'altra risposta a questa domanda.

Nota: poiché la causa per ottenere questo errore era completamente diversa rispetto a coloro che hanno suggerito export GPG_TTY=$(tty)prima (di solito come un suggerimento laterale) in altre risposte a questa domanda, ho deciso che questa domanda ha bisogno di un'altra risposta che menzioni che export GPG_TTY=$(tty)potrebbe essere la correzione principale e unica cosa necessaria in alcuni casi.


Grazie! update-alternatives --config pinentryfatto per me. Sono SSH nel mio desktop ed è pinentrystato impostato su /usr/bin/pinentry-gnome3(che dovrebbe avere un fallback TTY quando SSH entra o quando si passa a una console virtuale). Ma a quanto pare non funzionava. L'impostazione di default ha /usr/bin/pinentry-ttyfatto il trucco per me. Potrei doverlo ripristinare quando torno sul desktop, ma, per ora, sto bene. export GPG_TTY=$(tty)non era abbastanza. L'ho fatto ma avevo bisogno di passare pinentryprima che potessi firmare il mio commit.
Karl Wilbur,

1

Ciò che ha risolto per me è stato assicurarsi che il nome della chiave corrispondesse al mio nome utente git. Presumo che anche le e-mail debbano corrispondere. Questo potrebbe avere a che fare con me usando GPG KeyChain sul mio Mac. Non sono sicuro.

Pensavo di nominare la chiave quando l'ho compilata, ma immagino che mi stesse chiedendo il mio nome (git user name).

Modulo portachiavi GPG


È un peccato che questa risposta sia così indietro che molti non arriveranno qui a cercare il loro problema.
MaciekS,

1

Ho riscontrato questo errore su macos - per tentare di risolvere i problemi ho provato a elencare le chiavi per vedere se erano scadute usando gpg2 --list-keys- Ho verificato che le chiavi non erano scadute e che la chiave corretta era impostata nella mia configurazione usandogit config --global user.signingkey .

Dopo aver eseguito questi comandi, sono stato improvvisamente in grado di eseguire nuovamente i commit firmati senza problemi. Non ho modificato i file o le chiavi di configurazione, non ho nemmeno creato una nuova istanza di Terminal. Sembrava che il gpg2 fosse in qualche modo in uno stato strano sul mio mac.


0

Ho risolto il problema installandolo brew install gpg2e facendogit config --global gpg.program gpg2


0

Lo stesso errore può anche essere causato alla scadenza della chiave nella configurazione di git.

Si prega di controllare il contenuto cat .git/confige cercare signingkeyvalore e verificare se è scaduto. Se sì, aggiornalo con quello nuovo.


0

Se si utilizza la smart card / yubikey per memorizzare la chiave GPG e si imposta la signkeyconfigurazione di git mediante la chiave memorizzata nella scheda (e tutte le risposte sopra sembrano non risolvere il problema), il PIN bloccato della scheda potrebbe essere il causa principale di questo problema.

Per controllare il PIN bloccato:

gpg --card-status

Se il contatore è simile a

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

Quindi il PIN viene bloccato (dopo 3 tentativi falliti).

Per sbloccare il 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

Per me un semplice brew unintstall gnupg && brew cask reinstall gpg-suiterisolve il problema.

Disinstalla (nel mio caso) manualmente gpg con installazione homebrew e reinstalla l'intera GPG Suite.


0

Nel mio caso, avevo una configurazione mista di gpg e una configurazione di smimesign fornite nella documentazione di firma del commit qui: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- chiave

Dopo averci lavorato per ore, ho scoperto che il modo migliore per correggerlo era disinserire tutto ciò che riguardava gpg e riconfigurare gpg.

Come menzionato nella risposta di @Jason Thrasher, trova tutte le configurazioni git relative a gpg usando:

git config -l | grep gpg

Quindi disinserisci tutto in modo goloso e localmente usando:

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

Quindi riconfigurare seguendo la documentazione ufficiale sopra indicata. Spero che questo ti aiuti.


Inoltre, sto usando gpg2
Shubham Gupta

0

Se avevi già configurato la tua pinentry e gpg e ha smesso di funzionare dal nulla:

Controlla se il tuo gpg funziona:

echo "test" | gpg --clearsign

Se lo dice gpg: signing failed: No pinentry, riavvia semplicemente il client demone gpg, che di tanto in tanto si blocca:

gpgconf --kill gpg-agent

Ora dovrebbe funzionare:

echo "test" | gpg --clearsign

0

Nel mio caso, questo errore si è verificato durante l'esecuzione git commitsu una piccola tmuxfinestra che non era in grado di adattare il prompt della passphrase.

$ 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

Questo ti aiuterà a sbarazzartene

git config commit.gpgsign false


1
Non capisco il voto negativo, ha risolto il problema proposto come un incantesimo per me.
Jms

2
Questo comando dovrebbe essere evitato. Rimuoverà solo il requisito per firmare il commit git, non risolverà il problema di autenticare la persona che sta eseguendo il commit.
Kyle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.