Erreur Git - gpg n'a pas réussi à signer les données

149

Je viens de commencer à utiliser git et j'installe git et gpg via homebrew. Pour une raison quelconque, j'obtiens cette erreur lorsque git commit je regarde tant d'autres questions de stackoverflow concernant ce sujet et aucune d'elles n'a fonctionné pour moi. Comment puis-je corriger cette erreur afin que je puisse télécharger avec succès.

error: gpg failed to sign the data
fatal: failed to write commit object
Autoriser
la source
3
Pour les utilisateurs de Mac. J'ai eu ce problème. Les conseils sur cette page m'ont aidé à réaliser que j'avais peut-être deux versions de gpg installées et je l'ai fait. Un de brew et un de GPG Suite. Je voulais utiliser la suite GPG car elle permet de mettre en cache la phrase de passe dans le trousseau du système. La désinstallation de la version Brew a résolu mes problèmes. Avec la réponse de @ côtéshowbarker sur le meurtre de gpg-agent. Je suppose donc que les configurations de chacun interféraient les unes avec les autres.
Michael Welch
Copie possible de stackoverflow.com/questions/41502146/…
Dr Beco
Je viens de rencontrer un problème avec la signature gpg, le problème était que mon dépôt git n'avait pas son ensemble gpg.signingkey local, mais celui de gllobal l'était. Il suffit donc de définir git config --local user.signingkeyla bonne clé et la signature automatique sera à nouveau. et peut-être désarmé le mondial avecgit config --global --unset user.signingkey
MarcusJ

Réponses:

210

Pour le dépannage, deux choses à essayer d'abord:

  • run git config --global gpg.program gpg2, pour s'assurer que git utilise gpg2et nongpg
  • courir echo "test" | gpg2 --clearsign, pour s'assurer qu'il gpg2fonctionne

Si tout va bien, une chose suivante à essayer:

  • exécutez brew install pinentrypour vous assurer qu'un bon outil est installé pour la saisie de la phrase de passe

Si, après cette installation, vous réessayez git commitet obtenez toujours l' failed to sign the dataerreur " ":

  • exécuter gpgconf --kill gpg-agentpour tuer tout agent en cours d'exécution qui pourrait être bloqué

Si cela dit gpgconfn'est pas installé ou n'a pas d' --killoption, vous pouvez essayer ceci:

  1. cp ~/.gnupg ~/.gnupg-GOODpour enregistrer une copie de votre ~/.gnupgpour y revenir plus tard si nécessaire
  2. brew install gnupg21 pour installer GnuPG 2.1

La raison pour laquelle vous enregistrez une copie de votre ~/.gnupgrépertoire est que GnuPG 2.1 crée / modifie potentiellement certaines données clés d'une manière qui n'est pas rétrocompatible avec GnuPG 2.0 et les versions antérieures, donc si vous souhaitez revenir plus tard, vous pouvez le fairemv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg .


Sinon, il y a quelques étapes de base à exécuter pour vérifier que vous disposez d'un environnement GnuPG fonctionnel:

  • exécuter gpg2 -K --keyid-format SHORT, pour vérifier que vous avez au moins une paire de clés

Si la sortie de cela montre que vous n'avez pas de clé secrète à utiliser par GnuPG, vous devez en créer une:

  • exécuter gpg2 --gen-key, pour que GnuPG vous guide à travers les étapes de création d'une paire de clés

Si vous recevez un message d'erreur indiquant «ioctl inapproprié pour l'appareil» , procédez comme suit:

  • exécuter export GPG_TTY=$(tty)et / ou ajouter cela à votre ~/.bashrcou˜/.bash_profile
soiree
la source
J'obtiens cette erreur lorsque j'exécute la deuxième commande: gpg: pas de clé secrète par défaut: pas de clé secrète gpg: [stdin]: clearsign a échoué: pas de clé secrète
Entitiser
@Entitize Cela semble indiquer que gpg ne pense pas que vous ayez des clés à utiliser pour signer. Voir les étapes supplémentaires que j'ai ajoutées à la réponse; si vous n'avez jamais couru gpg2 --gen-keyauparavant, c'est ce que vous devez faire en premier.
Sideshowbarker
2
quand j'exécute echo "test" | gpg2 --clearsign, ça me donne: gpg-agent [-]: la commande get_passphrase a échoué: ioctl inapproprié pour le périphérique gpg: problème avec l'agent: ioctl inapproprié pour le périphérique gpg: pas de clé secrète par défaut: opération annulée gpg: [stdin]: clearsign a échoué: opération annulée. J'ai essayé tant d'autres possibilités, mais aucune ne fonctionne. Existe-t-il un moyen d'utiliser GIT sans GPG!
Entitiser
9
Vous pourriez essayer export GPG_TTY=$(tty). Pour autant qu'il existe un moyen d'utiliser git sans gpg, vous devriez pouvoir le faire par défaut ou simplement en exécutant git config --global commit.gpgsign falsepour annuler globalement la signature gpg de vos commits.
Sideshowbarker
10
Ici, sous Mac OS X, j'ai commencé à déboguer avec echo "test" | gpg2 --clearsign, trouvé une erreur et cela m'a conduit à ce fil , qui a résolu mon problème: je viens de mettre un export GPG_TTY=$(tty)dans mon ˜/.bash_profilefichier, puis rechargé avecsource ˜/.bash_profile
herrera
71

Git a besoin de savoir avec quelle clé il signe.

Après avoir configuré GPG, gpg-agent et vos fichiers gpg.conf (voir ce guide ), vous devez exécuter

git config --global user.signingkey EB11C755

Évidemment, remplacez la clé publique à la fin par la vôtre. Si vous voulez que chaque commit soit signé par défaut, utilisez

git config --global commit.gpgsign true
Xavier Ho
la source
7
Je viens de tomber dessus au cas où quelqu'un d'autre serait assez stupide pour faire ce que j'ai fait: assurez-vous de l'épeler «signaturekey» et non «signinkey».
ZNK
1
littéralement, ce commentaire de @ZNK l'a fait pour moi. Je l'avais épelé "signkey" au lieu de "signaturekey"
jzatt
1
La réponse acceptée devrait citer cela comme la première étape de dépannage, car parfois vous avez toutes vos clés déjà en place, c'est juste que git oublie quelle clé utiliser.
f055
41

D'une manière ou d'une autre, votre git est configuré pour signer GPG à chaque commit. La signature avec GPG n'est pas nécessaire pour valider ou pousser à l'aide de git. Cela donne probablement l'erreur car votre mécanisme de signature gpg n'est pas encore configuré.

Si vous êtes nouveau dans git, essayez de le faire fonctionner d'abord sans signature GPG au début, puis ajoutez une connexion plus tard si vous en avez vraiment besoin.

Vous pouvez vérifier comment votre git est configuré en ce qui concerne gpg en faisant:

git config -l | grep gpg

Qui peut produire zéro ou plusieurs lignes, y compris:

commit.gpgsign=true

Si "commit.gpgsign" est vrai, alors la signature gpg est activée. Désactivez-le avec:

git config --global --unset commit.gpgsign

Ensuite, essayez d'exécuter à nouveau votre validation. Il devrait maintenant fonctionner sans signature gpg. Une fois que vous avez fait fonctionner le git de base, vous devriez essayer de rajouter la signature gpg au mix.

Jason Thrasher
la source
12
Impressionnant! git config --global --unset commit.gpgsigntravaillé pour moi :)
hpaknia
sensationnel!! cela a fonctionné pour moi: git config --global --unset commit.gpgsign
Hardy Mathew
32

Référez-vous à @sideshowbarker et à la solution @Xavier Ho, j'ai résolu mon problème via les étapes suivantes.

Supposons que gpg2 soit installé par 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] [expire: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Rappelé par mon collègue, besoin d'ajouter

export GPG_TTY=$(tty)

à ~ / .zshrc si vous utilisez zsh, sinon ajoutez à ~ / .bash_profile


Pour macOS,

le gpg2 est combiné avec gpg dans brew et donc la commande gpg est pointée vers gpg2

brew install gpg2

infusion gpg

gnupg: stable 2.2.6 (en bouteille)

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

et il y a pinentry-mac pour l'entrée de la phrase de passe

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

Ajouter une ligne

pinentry-programme / usr / local / bin / pinentry-mac

Rappelé par mon collègue, besoin d'ajouter

export GPG_TTY=$(tty)

à ~ / .zshrc si vous utilisez zsh, sinon ajoutez à ~ / .bash_profile

V-SHY
la source
1
macOS 10.15 (Catalina) est livré avec GnuPG version 2.2.17, il n'est donc pas nécessaire de l'installer séparément, sauf si vous prévoyez de gérer vous-même les mises à jour.
Josh Habdas
18

Je l'utilise. Il prend en charge zsha et fonctionne sur le sous-système Windows pour Linux:

export GPG_TTY=$(tty)
Jamal Kaksouri
la source
2
J'utilise zsh sur MacOS Catalina et c'était le seul changement dont j'avais besoin pour le faire fonctionner. Merci.
JP Lew le
Je recevais l'erreur dans l'OP après avoir copié mes clés dans mon environnement WSL, il s'est avéré que je devais le faire pour fournir une invite pour la phrase de passe sur la clé. Merci.
narwic
10

Vérifiez que votre clé a expiré. Une fois que vous avez fixé la date d'expiration (pas besoin de créer une nouvelle clé sauf si vous le souhaitez), gitfonctionnera normalement.

Une façon de réparer la clé expirée:

(Remarque: $représente l'invite de ligne de commande, tapez les commandes après l'invite; appuyez sur Entrée après chaque commande)

$ gpg2 --list-keyspour trouver l'ID de clé approprié (caractères après \en publigne)

$ gpg2 --edit-key <key id> - cela ouvre le shell gpg, avec l'invite changée en gpg>

gpg> expire - suivez les instructions pour définir une nouvelle date d'expiration pour la clé primaire

Ensuite, s'il y a des sous-clés qui sont expirées ( subaffichées sur la ligne), réinitialisez également leurs dates d'expiration:

gpg> key 1- sélectionne la première sous gpg> expire- clé - suivez les instructions pour définir une nouvelle date d'expiration pour la sous-clé

Répétez pour chaque sous-clé suivante, si nécessaire.

leanne
la source
J'ai eu ce problème chaque fois que j'ai essayé d'exécuter une clé gpg qui n'avait pas de date d'expiration. Pour une raison quelconque, git n'aime pas ça. L'utilisation de cette méthode pour ajouter une date d'expiration (peu importe à quelle distance dans le futur) semble résoudre le problème.
some_guy632
N'oubliez pas de taper saveà l'invite gpg lorsque vous avez terminé!
daviewales
5

Cela a fonctionné pour moi sur Ubuntu 18.04

Vérifiez votre clé gpg

gpg -K --keyid-format LONG

si vous obtenez une réponse vide, générez une clé GPG

gpg --generate-key

réexécutez la première commande, vous devriez obtenir une sortie comme:

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]

définir la clé de chant git

git config --global user.singingkey 95A854E0593B3214

Alors tu peux y aller! (--global est facultatif)

Sinon, si cela ne vous dérange pas de signer avec votre clé ssh

git config commit.gpgsign false

notez que cela n'est pas recommandé en raison d'un problème de sécurité selon cette question ici et ici

poon gilbert
la source
"Sinon, si cela ne vous dérange pas de signer avec votre clé ssh" qu'est-ce que ssh a à voir avec la signature?
riffraff
SSH n'a rien à voir avec la signature de commits. Ils font référence à la désactivation de la signature de validation GPG et à l'utilisation de clés SSH pour vous authentifier lorsque vous poussez réellement vos validations sur un serveur git. Vous pouvez pousser (et c'est assez courant) pour pousser des commits non signés en utilisant l'authentification SSH.
phouse512 le
4

J'ai dû fixer le gpg.program au chemin absolu vers gpg:

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

J'utilise Windows avec cygwin.

fty4
la source
3
C'était la solution pour moi. J'ai installé gnupg en utilisant chocolatey.
Alex S
Merci, a travaillé pour moi aussi. J'avais faitchoco install gpg4win
Gokul NC
4

Solution:

Issue: Disabled loopback pinentry mode

Pour résoudre le problème, vous devez activer le mode de saisie en boucle dans ~ / .gnupg / gpg.conf :

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

use-agent 
pinentry-mode loopback

EOF

Et aussi dans ~ / .gnupg / gpg-agent.conf (créez le fichier s'il n'existe pas déjà):

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

allow-loopback-pinentry

EOF

Ensuite, redémarrez l'agent avec echo RELOADAGENT | gpg-connect-agentet vous devriez être prêt à partir!

La source

Rahul Thakur
la source
1
Wow, après avoir passé des heures à essayer toutes les solutions possibles, cela a résolu mon problème, merci!
Matt
De rien. Merci à la source en fait. J'étais coincé avec ça aussi.
Rahul Thakur le
3

Cette erreur peut également se produire lorsque votre clé GPG a expiré. Générer une nouvelle clé et l'ajouter à Git devrait résoudre ce problème.

osowskit
la source
3

J'ai rencontré ce problème après la mise à niveau vers gnupg 2.x. On verrait que gpg2 fait référence aux clés différemment: j'avais toujours signingkey = ABC98F11(paramètre gpg v1) dans mon ~/.gitconfig. Les identificateurs de clé pour gpg2 sont plus longs. Cherchez-les avecgpg --list-secret-keys

carpe
la source
1

J'avais créé une gitclé avec 3 clés séparées pour certify/ sign/ encryptet la clé montrée comme expirée dans le futur (après avoir bien fonctionné pendant quelques jours):

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     ]

créé une nouvelle clé sans ajouter de sous-clés séparées pour résoudre le problème.

Stuart Cardall
la source
1

Peut-être que votre configuration Git a été définie sur gpgsign = true . Essayez de le définir sur false si vous ne souhaitez pas attribuer vos validations. Accédez à votre dossier de référentiel et modifiez le fichier

nano .git / config

De ceci ...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

Pour ça...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false
alvaropaco
la source
1

Pour moi, cette erreur a commencé à se produire avec git tag -sDebian GNU / Linux lorsque je suis passé de pinentry-gnome3à pinentry-curses(utilisation update-alternatives --config pinentry) pour un accès à distance plus facile. Cela ne s'est produit qu'avec git tag -s, pas avec gpg(par exemple gpg --clearsign) lui-même.

Le seul changement nécessaire pour le faire fonctionner à nouveau dans ce cas était d'ajouter export GPG_TTY=$(tty)à mes fichiers de démarrage shell.

Je n'ai cependant pas reçu le message d'erreur «ioctl inapproprié pour le périphérique» mentionné comme indicateur de ce correctif dans une autre réponse à cette question.

Remarque: Étant donné que la cause de cette erreur était complètement différente de celle de ceux qui avaient suggéré export GPG_TTY=$(tty)auparavant (généralement comme indice secondaire) dans d'autres réponses à cette question, j'ai décidé que cette question nécessitait une autre réponse mentionnant que export GPG_TTY=$(tty)c'était peut-être le correctif principal et seule chose nécessaire dans certains cas.

Axel Beckert
la source
Merci! update-alternatives --config pinentryl'a fait pour moi. Je suis SSH sur mon bureau et j'ai pinentryété défini sur /usr/bin/pinentry-gnome3(ce qui devrait avoir un repli TTY lorsque SSH est activé ou lorsque je passe à une console virtuelle). Mais cela ne fonctionnait pas, apparemment. Définir la valeur par défaut a /usr/bin/pinentry-ttyfait l'affaire pour moi. Je devrai peut-être le remettre en place lorsque je reviendrai sur mon bureau, mais pour l'instant, je vais bien. export GPG_TTY=$(tty)n'était pas suffisant. Je l'ai fait mais j'ai dû changer pinentryavant de pouvoir signer mon commit.
Karl Wilbur
1

Ce qui m'a résolu, c'était de m'assurer que le nom de la clé correspondait à mon nom d'utilisateur git. Je suppose que les e-mails doivent également correspondre. Cela pourrait avoir à voir avec l'utilisation de GPG KeyChain sur mon Mac. Pas certain.

Je pensais nommer la clé lorsque j'ai rempli cela, mais je suppose que cela demandait mon nom (nom d'utilisateur git).

Formulaire porte-clés GPG

Jerinaw
la source
C'est dommage que cette réponse soit si loin derrière que beaucoup ne viendront pas ici chercher leur problème.
MaciekS
1

J'ai eu cette erreur sur macos - pour essayer de résoudre les problèmes, j'ai essayé de répertorier les clés pour voir si elles avaient expiré en utilisant gpg2 --list-keys- j'ai vérifié que les clés n'avaient pas expiré et que la clé appropriée était définie dans ma configuration en utilisant git config --global user.signingkey.

Après avoir exécuté ces commandes, j'ai été soudainement capable de refaire des commits signés sans problème. Je n'ai pas changé mes fichiers de configuration ou mes clés - je n'ai même pas créé une nouvelle instance de Terminal. Il semblait juste que le gpg2 était en quelque sorte dans un état étrange sur mon mac.

Joensson
la source
0

J'ai résolu le problème en installant brew install gpg2puis en faisantgit config --global gpg.program gpg2

cperez08
la source
0

La même erreur peut également être causée lorsque vous avez une clé expirée dans votre configuration git.

Veuillez vérifier le contenu cat .git/configet rechercher la signingkeyvaleur et vérifier si elle est expirée. Si oui, mettez-le à jour avec le nouveau.

Prateek Jain
la source
0

Si vous utilisez une carte à puce / yubikey pour stocker votre clé GPG et que vous définissez la configuration signkeyde git par la clé stockée dans la carte (et que toutes les réponses ci-dessus ne semblent pas résoudre votre problème), votre code PIN bloqué de la carte peut être le cause principale de ce problème.

Pour vérifier le code PIN bloqué:

gpg --card-status

Si le compteur est similaire à

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

Ensuite, votre code PIN est bloqué (après 3 essais infructueux).

Pour débloquer le code 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
Vinh VO
la source
0

Pour moi un simple brew unintstall gnupg && brew cask reinstall gpg-suite résout le problème.

Il désinstalle le (dans mon cas) manuellement gpg homebrew-istalled et réinstalle toute la suite GPG.

blackjacx
la source
0

Dans mon cas, j'avais une configuration gpg mixte et une configuration smimesign donnée dans la documentation de signature de commit ici: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- clé

Après avoir travaillé dessus pendant des heures, j'ai trouvé le meilleur moyen de corriger tout ce qui était lié à gpg et à reconfigurer gpg.

Comme mentionné dans la réponse de @Jason Thrasher, trouvez toute la configuration git liée à gpg en utilisant:

git config -l | grep gpg

Ensuite, désactivez tout golablly ainsi que localement en utilisant:

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

Puis reconfigurez en suivant la documentation officielle donnée ci-dessus. J'espère que cela t'aides.

Shubham Gupta
la source
Aussi, j'utilise gpg2
Shubham Gupta
0

Si vous aviez déjà configuré votre pinentry et votre gpg et que cela ne fonctionnait plus de nulle part:

Vérifiez si votre gpg fonctionne:

echo "test" | gpg --clearsign

Si c'est le cas gpg: signing failed: No pinentry, redémarrez simplement le client du démon gpg, qui se bloque de temps en temps:

gpgconf --kill gpg-agent

Maintenant, cela devrait fonctionner:

echo "test" | gpg --clearsign
MCFreddie777
la source
0

Dans mon cas, cette erreur s'est produite lors de l'exécution git commitsur une petite tmuxfenêtre qui ne pouvait pas s'adapter à l'invite de phrase de passe.

$ 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
Rui Afonso Pereira
la source
-6

Cela vous aidera à vous en débarrasser

git config commit.gpgsign false

nmanikumar5
la source
1
Je ne comprends pas le vote défavorable, il a résolu le problème proposé comme un charme pour moi.
Jms
2
Cette commande doit être évitée. Cela supprimera uniquement l'obligation de signer le commit git, et ne résoudra pas le problème d'authentification de la personne qui effectue le commit.
Kyle