Erro Git - o gpg não conseguiu assinar os dados

149

Comecei a usar o git e instalo o git e o gpg via homebrew. Por alguma razão, recebo esse erro quando git commit olho para muitas outras perguntas sobre o stackoverflow relacionadas a este tópico e nenhuma delas funcionou para mim. Como posso corrigir esse erro para fazer o upload com sucesso.

error: gpg failed to sign the data
fatal: failed to write commit object
Entitize
fonte
3
Para usuários de Mac. Eu tive esse problema. Os conselhos nesta página me ajudaram a perceber que posso ter duas versões do gpg instaladas e o fiz. Um da fermentação e outro da GPG Suite. Eu queria usar o GPG Suite one, pois ele permite armazenar em cache a frase secreta nas chaves do sistema. A desinstalação da versão de distribuição resolveu meus problemas. Juntamente com a resposta do @ sideshowbarker sobre matar o gpg-agent. Então, suponho que as configurações de cada um estavam interferindo entre si.
Michael Welch
Possível duplicado de stackoverflow.com/questions/41502146/...
Dr Beco
Acabei de encontrar um problema com a assinatura gpg, o problema era que meu repositório git não tinha o conjunto local gpg.signingkey, mas o gllobal era. Então, basta definir git config --local user.signingkeya chave correta e ela será autoassinada novamente. e talvez desarmar o global comgit config --global --unset user.signingkey
MarcusJ

Respostas:

210

Para solução de problemas, duas coisas a serem tentadas primeiro:

  • corre git config --global gpg.program gpg2 , para garantir que o git use gpg2e nãogpg
  • corre echo "test" | gpg2 --clearsign , para se certificar de que gpg2está funcionando

Se tudo estiver correto, tente outra coisa:

  • execute brew install pinentrypara garantir que você tenha uma boa ferramenta instalada para entrada da senha

Se depois dessa instalação e você tentar novamente git commite ainda receber o failed to sign the dataerro " ":

  • executar gpgconf --kill gpg-agentpara matar qualquer agente em execução que possa estar pendurado

Se isso diz gpgconf não está instalado ou não tem uma --killopção, você pode tentar o seguinte:

  1. cp ~/.gnupg ~/.gnupg-GOODpara salvar uma cópia da sua ~/.gnupgpara reverter mais tarde, se necessário
  2. brew install gnupg21 instalar o GnuPG 2.1

O motivo para salvar uma cópia do seu ~/.gnupgdiretório é que o GnuPG 2.1 potencialmente cria / altera alguns dados-chave de uma maneira que não é compatível com versões anteriores do GnuPG 2.0 e anterior, então se você quiser voltar mais tarde, poderá fazê-lo mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


Caso contrário, existem algumas etapas básicas a serem executadas para verificar se você tem um ambiente GnuPG funcional:

  • executar gpg2 -K --keyid-format SHORT, para verificar se você tem pelo menos um par de chaves

Se o resultado disso mostrar que você não possui uma chave secreta para o GnuPG, então você precisa criar uma:

  • executar gpg2 --gen-key, para que o GnuPG o guie pelas etapas de criação de um par de chaves

Se você receber uma mensagem de erro dizendo "ioctl inadequado para o dispositivo" , faça o seguinte:

  • execute export GPG_TTY=$(tty)e / ou adicione isso ao seu ~/.bashrcou˜/.bash_profile
sideshowbarker
fonte
Eu recebo esse erro quando executo o segundo comando: gpg: nenhuma chave secreta padrão: nenhuma chave secreta gpg: [stdin]: clearsign falhou: nenhuma chave secreta
Entitize
@ Entitize Isso parece indicar que o gpg não acha que você tem chaves para assinar. Veja as etapas adicionais que adicionei à resposta; se você nunca correu gpg2 --gen-keyantes, é isso que você precisa fazer primeiro.
Sideshowbarker
2
quando executo echo "test" | gpg2 --clearsign, ele me fornece: gpg-agent [-]: comando get_passphrase falhou: ioctl inadequado para o dispositivo gpg: problema com o agente: ioctl inadequado para o dispositivo gpg: nenhuma chave secreta padrão: operação cancelada gpg: [stdin]: clearsign falhou: operação cancelada. Eu tentei muitas outras possibilidades, mas nenhuma funciona. Existe uma maneira de usar o GIT sem GPG!
Entitize
9
Você pode tentar export GPG_TTY=$(tty). Na medida em que exista uma maneira de usar o git sem o gpg, você poderá fazer isso por padrão ou apenas executando git config --global commit.gpgsign falsea assinatura globalmente desativada de seus commits.
sideshowbarker
10
Aqui no Mac OS X, eu comecei a depuração com echo "test" | gpg2 --clearsign, encontrou um erro e isso me leva a esta discussão , que resolveu o meu problema: Eu só pôr export GPG_TTY=$(tty)no meu ˜/.bash_profilearquivo e então recarregado comsource ˜/.bash_profile
herrera
71

O Git precisa saber com qual chave está assinando.

Depois de configurar os arquivos GPG, gpg-agent e gpg.conf (consulte este guia ), é necessário executar

git config --global user.signingkey EB11C755

Obviamente, substitua a chave pública no final pela sua. Se você deseja que todo commit seja assinado por padrão, use

git config --global commit.gpgsign true
Xavier Ho
fonte
7
Eu acabei de encontrar isso no caso de alguém ser tolo o suficiente para fazer o que eu fiz: certifique-se de soletrar "signaturekey" e não "signinkey".
ZNK 31/10
1
literalmente, esse comentário de @ZNK fez isso por mim. Eu tinha escrito que "signkey" em vez de "signingkey"
jzatt
1
A resposta aceita deve citar isso como a primeira etapa de solução de problemas, porque às vezes você já tem todas as suas chaves no lugar, é apenas o git esquece qual chave usar.
f055 20/01
41

De alguma forma, seu git está configurado para assinar o GPG a cada confirmação. Não é necessário assinar com GPG para confirmar ou enviar usando git. Provavelmente está dando o erro porque seu mecanismo de assinatura de gpg ainda não está configurado.

Se você é novo no git, tente fazê-lo funcionar primeiro sem a assinatura do GPG e, em seguida, adicione mais tarde, se realmente precisar.

Você pode verificar como o seu git está configurado em relação ao gpg fazendo:

git config -l | grep gpg

O que pode produzir zero ou mais linhas, incluindo:

commit.gpgsign=true

Se "commit.gpgsign" for verdadeiro, você terá a assinatura de gpg ativada. Desative-o com:

git config --global --unset commit.gpgsign

Em seguida, tente executar seu commit novamente. Agora ele deve ser executado sem a assinatura do gpg. Depois de obter o git básico funcionando, tente adicionar a assinatura do gpg de volta ao mix.

Jason Thrasher
fonte
12
Impressionante! git config --global --unset commit.gpgsigntrabalhou para mim :)
hpaknia
Uau!! ele trabalhou para mim: git configuração --global --unset commit.gpgsign
Hardy Mathew
32

Consulte @sideshowbarker e a solução @Xavier Ho, resolvi meu problema seguindo as etapas a seguir.

Suponha que o gpg2 esteja instalado pelo 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 29/06/2017 [SC] [expira em 29/06/2019]

git config --global user.signingkey 0A61C6FC

Lembrado pelo meu colega, preciso anexar

export GPG_TTY=$(tty)

para ~ / .zshrc, se estiver usando zsh, caso contrário, adicione ~ / .bash_profile


Para o macOS,

o gpg2 é combinado com gpg no brew e, portanto, o comando gpg é apontado para gpg2

brew install gpg2

informação da fermentação gpg

gnupg: estável 2.2.6 (engarrafado)

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

e tem pinentry-mac para entrada de senha

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

Adicionar linha

programa pinentry / usr / local / bin / pinentry-mac

Lembrado pelo meu colega, preciso anexar

export GPG_TTY=$(tty)

para ~ / .zshrc, se estiver usando zsh, caso contrário, adicione ~ / .bash_profile

V-SHY
fonte
1
O macOS 10.15 (Catalina) é fornecido com o GnuPG versão 2.2.17; portanto, não é necessário instalá-lo separadamente, a menos que você planeje gerenciar as atualizações por conta própria.
21919 Josh Habdas
18

Eu estou usando isso. Ele suporta o zsha e funciona no Windows Subsystem for Linux:

export GPG_TTY=$(tty)
Jamal Kaksouri
fonte
2
Estou usando o zsh no MacOS Catalina e essa foi a única alteração necessária para fazê-lo funcionar. Obrigado.
JP Lew
Eu estava recebendo o erro no OP depois de copiar minhas chaves no meu ambiente WSL. Acontece que eu precisava fazer isso para fornecer um prompt para a senha na chave. Obrigado.
narwic
10

Verifique se a sua chave está vencida. Depois de fixar a data de validade (não é necessário criar uma nova chave, a menos que você queira),git funcionará normalmente.

Uma maneira de corrigir a chave expirada:

(Nota: $ representa o prompt da linha de comando, digite os comandos após o prompt; pressione Enter após cada comando)

$ gpg2 --list-keyspara encontrar o ID da chave apropriado (caracteres depois \depub linha)

$ gpg2 --edit-key <key id> - isso abre o shell gpg, com o prompt alterado para gpg>

gpg> expire - siga as instruções para definir a nova data de validade da chave primária

Em seguida, se houver subchaves que expiraram ( submostradas na linha), redefina as datas de vencimento também:

gpg> key 1- seleciona a primeira subchave gpg> expire- siga as instruções para definir a nova data de validade da subchave

Repita para cada subchave subsequente, conforme necessário.

leanne
fonte
Eu tive esse problema toda vez que tentei executar uma chave gpg que não tinha data de validade. Por alguma razão, o git não gosta disso. O uso desse método para adicionar uma data de validade (não importa a que distância no futuro) pareça resolver o problema.
some_guy632
Não se esqueça de digitar saveno prompt do gpg quando terminar!
daviewales 25/07
5

Isso funcionou para mim no ubuntu 18.04

Verifique sua chave gpg

gpg -K --keyid-format LONG

se você receber uma resposta em branco, gere uma chave GPG

gpg --generate-key

execute novamente o primeiro comando, você deve obter uma saída como:

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]

definir chave de canto git

git config --global user.singingkey 95A854E0593B3214

então você está pronto para ir! (--global é opcional)

Alternativamente, se você não se importa de assinar com sua chave ssh

git config commit.gpgsign false

observe que isso não é recomendado devido a um problema de segurança de acordo com esta pergunta aqui e aqui

poon gilbert
fonte
"Como alternativa, se você não se importa de assinar com sua chave ssh", o que o ssh tem a ver com a assinatura?
Riffraff
O SSH não tem nada a ver com a assinatura de confirmações. Eles estão se referindo a desativar a assinatura de confirmação GPG e, dependendo do uso de chaves SSH para autenticar quando você envia por push suas confirmações para um servidor git. Você pode enviar (e é bastante comum) enviar confirmações não assinadas usando autenticação SSH.
phouse512 29/01
4

Eu tive que corrigir o gpg.program no caminho absoluto para o gpg:

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

Estou usando o Windows com cygwin.

fty4
fonte
3
Esta foi a solução para mim. Eu instalei o gnupg usando chocolatey.
Alex S
Obrigado, funcionou para mim também. Eu tinha feitochoco install gpg4win
Gokul NC
4

Solução:

Issue: Disabled loopback pinentry mode

Para resolver o problema, você precisa ativar o modo de pinentry de loopback em ~ / .gnupg / gpg.conf :

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

use-agent 
pinentry-mode loopback

EOF

E também em ~ / .gnupg / gpg-agent.conf (crie o arquivo se ele ainda não existir):

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

allow-loopback-pinentry

EOF

Em seguida, reinicie o agente echo RELOADAGENT | gpg-connect-agente você deve estar pronto!

Fonte

Rahul Thakur
fonte
1
Uau, depois de passar horas tentando todas as soluções possíveis, isso resolveu meu problema, obrigado!
Matt
De nada. Graças à fonte, na verdade. Eu também estava preso nisso.
Rahul Thakur 01/07
3

Este erro também pode ocorrer quando sua chave GPG expirou. Gerar uma nova chave e adicioná-la ao Git deve resolver isso.

osowskit
fonte
3

Tive esse problema depois de atualizar para o gnupg 2.x. Veria que o gpg2 está referenciando chaves de maneira diferente: eu ainda tinha signingkey = ABC98F11(configuração de gpg v1) na minha ~/.gitconfig. Os identificadores de chave para o gpg2 são mais longos. Procure-os comgpg --list-secret-keys

carpa
fonte
1

Eu havia feito uma gitchave com três chaves separadas para certify/ sign/ encrypte a chave era exibida como expirada no futuro (depois de funcionar bem por alguns dias):

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     ]

fez uma nova chave sem adicionar subchaves separadas para resolver o problema.

Stuart Cardall
fonte
1

Pode ser que sua configuração do Git tenha sido definida como gpgsign = true . Tente configurá-lo como false se você não deseja atribuir seus commits. Vá para a pasta do repositório e altere o arquivo

nano .git / config

A partir disso ...

[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

Para isso...

[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
fonte
1

Para mim, esse erro começou a ocorrer git tag -sno Debian GNU / Linux quando mudei de pinentry-gnome3para pinentry-curses(usando update-alternatives --config pinentry) para facilitar o acesso remoto. Ocorreu apenas com git tag -s, não com gpg(por exemplo,gpg --clearsign ) em si.

A única alteração necessária para fazê-lo funcionar novamente neste caso foi adicionar export GPG_TTY=$(tty) aos meus arquivos de inicialização do shell.

Embora eu não tenha recebido a mensagem de erro "ioctl inadequado para dispositivo" mencionada como indicador dessa correção em outra resposta a esta pergunta.

Nota: Como a causa para obter esse erro foi completamente diferente daquela para aqueles que sugeriram export GPG_TTY=$(tty)antes (geralmente como uma dica lateral) em outras respostas a esta pergunta, decidi que essa pergunta precisa de outra resposta que mencione que export GPG_TTY=$(tty)pode ser a principal correção e única coisa necessária em alguns casos.

Axel Beckert
fonte
Obrigado! update-alternatives --config pinentryfez isso por mim. Estou com SSH na minha área de trabalho e pinentryfoi definido como /usr/bin/pinentry-gnome3(que deve ter um fallback TTY quando o SSH estiver no ou quando for alternado para um console virtual). Mas não estava funcionando, aparentemente. Definir o padrão para /usr/bin/pinentry-ttyo truque para mim. Talvez eu precise restaurá-lo quando voltar à minha área de trabalho, mas, por enquanto, estou bem. export GPG_TTY=$(tty)não foi suficiente. Fiz isso, mas precisava mudar pinentryantes que eu pudesse assinar meu commit.
22418 Karl Wilbur
1

O que resolveu isso para mim foi garantir que o nome da chave correspondesse ao meu nome de usuário git. Presumo que os e-mails também devem corresponder. Isso pode ter a ver comigo usando o GPG KeyChain no meu Mac. Não tenho certeza.

Eu pensei que estava nomeando a chave quando preenchi isso, mas acho que estava pedindo meu nome (nome de usuário git).

Formulário GPG Keychain

Jerinaw
fonte
É uma pena que esta resposta esteja tão atrasada que muitos não cheguem aqui procurando por seu problema.
MaciekS 26/03
1

Eu tive esse erro no macos - para tentar solucionar problemas, tentei listar as chaves para verificar se elas haviam expirado usando gpg2 --list-keys- verifiquei que as chaves não haviam expirado e que a chave correta foi definida na minha configuração usando git config --global user.signingkey.

Depois de executar esses comandos, de repente fui capaz de realizar confirmações assinadas novamente sem problemas. Não alterei meus arquivos ou chaves de configuração - nem criei uma instância nova do Terminal. Parecia que o gpg2 estava de alguma forma estranho no meu mac.

joensson
fonte
0

Eu resolvi o problema instalando brew install gpg2e fazendogit config --global gpg.program gpg2

cperez08
fonte
0

O mesmo erro também pode ser causado quando você expirou a chave na sua configuração do git.

Verifique o conteúdo cat .git/confige procure por signingkeyvalor e verifique se ele expirou. Se sim, atualize-o com o novo.

Prateek Jain
fonte
0

Se você estiver usando o smart card / yubikey para armazenar sua chave GPG e definir a configuração signkeydo git pela chave armazenada no cartão (e todas as respostas acima parecem não resolver o problema), o PIN bloqueado do cartão pode ser o causa raiz desse problema.

Para verificar o PIN bloqueado:

gpg --card-status

Se o contador for semelhante a

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

Em seguida, seu PIN é bloqueado (após três tentativas malsucedidas).

Para desbloquear o 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
fonte
0

Para mim, um simples brew unintstall gnupg && brew cask reinstall gpg-suiteresolve o problema.

Ele desinstala o (no meu caso) gpg manualmente homebrew-isallall e reinstala todo o GPG Suite.

blackjacx
fonte
0

No meu caso, eu misturei a configuração gpg e a configuração smimesign fornecidas na documentação de assinatura de confirmação aqui: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- chave

Depois de trabalhar por horas, achei que a melhor maneira de corrigi-lo era desmarcar tudo relacionado ao gpg e reconfigurar o gpg.

Como mencionado na resposta de Jason Thrasher, encontre toda a configuração do git relacionada ao gpg usando:

git config -l | grep gpg

Em seguida, desmarque tudo de maneira correta e localmente usando:

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

Em seguida, reconfigure seguindo a documentação oficial fornecida acima. Espero que isto ajude.

Shubham Gupta
fonte
Além disso, eu estou usando gpg2
Shubham Gupta
0

Se você já instalou o pinentry e o gpg e parou de funcionar do nada:

Verifique se o seu gpg funciona:

echo "test" | gpg --clearsign

Se estiver escrito gpg: signing failed: No pinentry, basta reiniciar o cliente daemon gpg, que fica parado de tempos em tempos:

gpgconf --kill gpg-agent

Agora deve estar funcionando:

echo "test" | gpg --clearsign
MCFreddie777
fonte
0

No meu caso, esse erro ocorreu ao executar git commitem uma pequena tmuxjanela que não era capaz de atender ao prompt da senha.

$ 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
fonte
-6

Isso ajudará você a se livrar dele

git config commit.gpgsign false

nmanikumar5
fonte
1
Eu não entendo o voto negativo, resolveu a questão proposta como um encanto para mim.
Jms
2
Este comando deve ser evitado. Ele removerá apenas o requisito de assinar o commit do git, não resolverá o problema de autenticar a pessoa que está fazendo o commit.
Kyle