Error de git: gpg no pudo firmar los datos

149

Acabo de comenzar a usar git e instalo git y gpg a través de homebrew. Por alguna razón, recibo este error cuando lo git commit hice, miré muchas otras preguntas de stackoverflow con respecto a este tema y ninguna de ellas funcionó para mí. ¿Cómo puedo solucionar este error para poder cargar correctamente?

error: gpg failed to sign the data
fatal: failed to write commit object
Entitize
fuente
3
Para usuarios de Mac. Tuve este problema Los consejos sobre esta página me ayudaron a darme cuenta de que puedo tener dos versiones de gpg instaladas y lo hice. Uno de brew y otro de GPG Suite. Quería usar GPG Suite one ya que permite el almacenamiento en caché de la frase de contraseña en el llavero del sistema. Desinstalar la versión brew resolvió mis problemas. Junto con la respuesta de @ sideshowbarker sobre matar a gpg-agent. Así que supongo que las configuraciones de cada uno estaban interfiriendo entre sí.
Michael Welch el
Posible duplicado de stackoverflow.com/questions/41502146/…
Dr Beco
Acabo de encontrar un problema con la firma de gpg, el problema era que mi repositorio de git no tenía su conjunto local gpg.signingkey, pero el gllobal sí. Tan solo configure git config --local user.signingkeyla clave correcta y se volverá a firmar automáticamente. y tal vez desarmar el global congit config --global --unset user.signingkey
MarcusJ

Respuestas:

210

Para la resolución de problemas, hay dos cosas que primero debe probar:

  • ejecutar git config --global gpg.program gpg2, para asegurarse de que git usa gpg2y nogpg
  • correr echo "test" | gpg2 --clearsign, para asegurarse de que gpg2funciona

Si todo parece estar bien, lo siguiente que debes intentar:

  • ejecutar brew install pinentrypara asegurarse de que tiene una buena herramienta instalada para la entrada de frase de contraseña

Si después de esa instalación, vuelve a intentarlo git commity aún obtiene el " failed to sign the data" error:

  • ejecutar gpgconf --kill gpg-agentpara matar a cualquier agente en ejecución que pueda estar colgado

Si eso dice que gpgconfno está instalado o no tiene una --killopción, puede intentar esto:

  1. cp ~/.gnupg ~/.gnupg-GOODpara guardar una copia de su ~/.gnupgpara volver más tarde si es necesario
  2. brew install gnupg21 instalar GnuPG 2.1

La razón para guardar una copia de su ~/.gnupgdirectorio es que GnuPG 2.1 potencialmente crea / cambia algunos datos clave de una manera que no es compatible con versiones anteriores de GnuPG 2.0 y anteriores, por lo que si desea volver más tarde, puede hacerlo mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


De lo contrario, hay algunos pasos básicos que debe ejecutar para verificar que tenga un entorno GnuPG que funcione:

  • ejecutar gpg2 -K --keyid-format SHORT, para comprobar que tiene al menos un par de claves

Si el resultado de eso muestra que no tiene una clave secreta para GnuPG, entonces necesita crear una:

  • correr gpg2 --gen-key, para que GnuPG lo guíe a través de los pasos para crear un par de claves

Si recibe un mensaje de error que dice "ioctl inadecuado para el dispositivo" , haga lo siguiente:

  • ejecutar export GPG_TTY=$(tty)y / o agregar eso a su ~/.bashrco˜/.bash_profile
sidehowbarker
fuente
Recibo este error cuando ejecuto el segundo comando: gpg: sin clave secreta predeterminada: Sin clave secreta gpg: [stdin]: error de firma clara: Sin clave secreta
Entitize
@Entitize Eso parece indicar que gpg no cree que tenga ninguna clave para usar para firmar. Vea los pasos adicionales que agregué a la respuesta; Si nunca gpg2 --gen-keyantes has corrido , eso es lo que debes hacer primero.
sidehowbarker
2
cuando ejecuto echo "prueba" | gpg2 --clearsign, me da: gpg-agent [-]: falló el comando get_passphrase: ioctl inapropiado para dispositivo gpg: problema con el agente: ioctl inapropiado para dispositivo gpg: sin clave secreta predeterminada: Operación cancelada gpg: [stdin]: error de borrado: operación cancelada. He probado muchas otras posibilidades, pero ninguna funciona. ¿Hay alguna manera de usar GIT sin GPG!
Entitize
9
Podrías intentarlo export GPG_TTY=$(tty). En cuanto a si hay una manera de usar git sin gpg, debería poder hacerlo de manera predeterminada o simplemente ejecutando git config --global commit.gpgsign falsepara firmar globalmente gpg de sus confirmaciones.
sidehowbarker
10
Aquí en Mac OS X, comencé a depurar echo "test" | gpg2 --clearsign, encontré un error y me llevó a este hilo , que resolvió mi problema: simplemente puse un archivo export GPG_TTY=$(tty)en mi ˜/.bash_profilearchivo y luego lo recargué consource ˜/.bash_profile
herrera
71

Git necesita saber con qué clave está firmando.

Después de configurar GPG, gpg-agent y sus archivos gpg.conf (consulte esta guía ), debe ejecutar

git config --global user.signingkey EB11C755

Obviamente, reemplace la clave pública al final con la suya. Si desea que cada confirmación se firme de forma predeterminada, use

git config --global commit.gpgsign true
Xavier Ho
fuente
77
Me topé con esto en caso de que alguien más fuera lo suficientemente tonto como para hacer lo que hice: asegúrate de deletrearlo "firmando" y no "firmando".
ZNK
1
literalmente este comentario de @ZNK lo hizo por mí. Lo deletreé "clave de firma" en lugar de "clave de firma"
jzatt
1
La respuesta aceptada debería citar esto como el primer paso de solución de problemas, porque a veces ya tiene todas sus claves en su lugar, es solo que git olvida qué clave usar.
f055
41

De alguna manera, su git está configurado para GPG firmar cada confirmación. No es necesario firmar con GPG para confirmar o enviar usando git. Es probable que esté dando el error porque su mecanismo de firma gpg aún no está configurado.

Si es nuevo en git, intente que funcione primero sin GPG al principio, luego agregue el inicio de sesión más tarde si realmente lo necesita.

Puede verificar cómo está configurado su git con respecto a gpg haciendo:

git config -l | grep gpg

Que puede producir cero o más líneas, que incluyen:

commit.gpgsign=true

Si "commit.gpgsign" es verdadero, entonces tiene habilitada la firma gpg. Desactívelo con:

git config --global --unset commit.gpgsign

Luego intente ejecutar su confirmación nuevamente. Ahora debería ejecutarse sin firmar gpg. Después de que funcione el git básico, debería intentar agregar la firma gpg nuevamente a la mezcla.

Jason Thrasher
fuente
12
¡Increíble! git config --global --unset commit.gpgsignfuncionó para mí :)
hpaknia
¡¡Guau!! funcionó para mí: git config --global --unset commit.gpgsign
Hardy Mathew
32

Consulte @sideshowbarker y @Xavier Ho, resolví mi problema siguiendo los pasos.

Supongamos que gpg2 instalado por 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] [caduca: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Recordado por mi colega, necesito agregar

export GPG_TTY=$(tty)

a ~ / .zshrc si usa zsh, de lo contrario agregue a ~ / .bash_profile


Para macOS,

el gpg2 se combina con gpg en brew y, por lo tanto, el comando gpg apunta a gpg2

brew install gpg2

brew info gpg

gnupg: estable 2.2.6 (embotellado)

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

y hay pinentry-mac para la entrada de frase de contraseña

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

Añadir línea

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

Recordado por mi colega, necesito agregar

export GPG_TTY=$(tty)

a ~ / .zshrc si usa zsh, de lo contrario agregue a ~ / .bash_profile

V-SHY
fuente
1
macOS 10.15 (Catalina) se entrega con GnuPG versión 2.2.17, por lo que no es necesario instalarlo por separado a menos que planee administrar las actualizaciones por su cuenta.
Josh Habdas
18

Lo estoy usando. Tiene soporte para zsha y funciona en Windows Subsystem para Linux:

export GPG_TTY=$(tty)
Jamal Kaksouri
fuente
2
Estoy usando zsh en MacOS Catalina y este fue el único cambio que necesitaba para que funcione. Gracias.
JP Lew
Estaba recibiendo el error en el OP después de copiar mis claves en mi entorno WSL, resultó que necesitaba hacer esto para proporcionar un mensaje para la frase de contraseña en la clave. Gracias.
narwic
10

Verifique que su clave caduque. Una vez que arregle la fecha de vencimiento (no es necesario crear una nueva clave a menos que lo desee), gitfuncionará normalmente.

Una forma de arreglar la clave caducada:

(Nota: $representa la línea de comando, escriba los comandos después de la línea de comando; presione Entrar después de cada comando)

$ gpg2 --list-keyspara encontrar la identificación de clave adecuada (caracteres después \depub línea)

$ gpg2 --edit-key <key id> - esto abre el shell gpg, con el aviso cambiado a gpg>

gpg> expire - siga las instrucciones para establecer una nueva fecha de vencimiento para la clave primaria

A continuación, si hay subclaves que están vencidas (se submuestran en la línea), restablezca también sus fechas de vencimiento:

gpg> key 1- selecciona la primera subclave gpg> expire- sigue las instrucciones para establecer una nueva fecha de vencimiento para la subclave

Repita para cada subclave posterior, según sea necesario.

leanne
fuente
He tenido este problema cada vez que he intentado ejecutar una clave gpg que no tenía una fecha de vencimiento. Por alguna razón, a git no le gusta eso. El uso de este método para agregar una fecha de vencimiento (no importa cuán lejos en el futuro) parezca resolver el problema.
some_guy632
¡No olvides escribir saveen el indicador de gpg cuando hayas terminado!
daviewales
5

Esto funcionó para mí en ubuntu 18.04

Comprueba tu clave gpg

gpg -K --keyid-format LONG

si obtiene una respuesta en blanco, genere una clave GPG

gpg --generate-key

vuelva a ejecutar el primer comando, debería obtener una salida 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]

establecer clave de canto git

git config --global user.singingkey 95A854E0593B3214

¡Entonces, ya puedes irte! (--global es opcional)

Alternativamente, si no le importa firmar con su clave ssh

git config commit.gpgsign false

tenga en cuenta que esto no se recomienda debido a un problema de seguridad de acuerdo con esta pregunta aquí y aquí

Poon Gilbert
fuente
"Alternativamente, si no le importa firmar con su clave ssh", ¿qué tiene que ver ssh con la firma?
riffraff
SSH no tiene nada que ver con firmar confirmaciones. Se refieren a desactivar la firma de confirmación GPG, y dependen del uso de claves SSH para autenticarse cuando realmente envía sus confirmaciones a un servidor git. Puede presionar (y es bastante común) para enviar confirmaciones sin firmar mediante la autenticación SSH.
phouse512
4

Tuve que arreglar el gpg.program a la ruta absoluta a gpg:

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

Estoy usando Windows con cygwin.

fty4
fuente
3
Esta fue la solución para mí. He instalado gnupg con chocolate.
Alex S
Gracias, funcionó para mí también. Lo había hechochoco install gpg4win
Gokul NC
4

Solución:

Issue: Disabled loopback pinentry mode

Para resolver el problema, debe habilitar el modo pinentry loopback en ~ / .gnupg / gpg.conf :

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

use-agent 
pinentry-mode loopback

EOF

Y también en ~ / .gnupg / gpg-agent.conf (cree el archivo si aún no existe):

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

allow-loopback-pinentry

EOF

¡Luego reinicie el agente con echo RELOADAGENT | gpg-connect-agenty debería estar listo!

Fuente

Rahul Thakur
fuente
1
Wow, después de pasar horas probando todas las soluciones posibles, esto solucionó mi problema, ¡gracias!
Matt
De nada. Gracias a la fuente en realidad. Estaba atrapado con esto también.
Rahul Thakur
3

Este error también puede ocurrir cuando su clave GPG ha caducado. Generar una nueva clave y agregarla a Git debería resolver esto.

osowskit
fuente
3

Experimenté este problema después de actualizar a gnupg 2.x. Se vería que gpg2 hace referencia a claves de manera diferente: todavía tenía signingkey = ABC98F11(configuración de gpg v1) en mi ~/.gitconfig. Los identificadores clave para gpg2 son más largos. Míralos congpg --list-secret-keys

carpa
fuente
1

Hice una gitclave con 3 claves separadas para certify/ sign/ encrypty la clave se mostró expirada en el futuro (después de trabajar bien durante unos días):

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     ]

creó una nueva clave sin agregar subclaves separadas para resolver el problema.

Stuart Cardall
fuente
1

Puede ser que su configuración de Git se haya configurado gpgsign = true . Intenta establecerlo en falso si no quieres asignar tus commits. Vaya a su carpeta de repositorio y cambie el archivo

nano .git / config

De esto...

[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

A esto...

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

Para mí comenzó a ocurrir con este error git tag -sen Debian GNU / Linux cuando he pasado de pinentry-gnome3a pinentry-curses(usando update-alternatives --config pinentry) para el acceso remoto más fácil. Solo ocurrió con git tag -s, no con gpg(por ejemplo gpg --clearsign) sí mismo.

El único cambio necesario para que funcione nuevamente en este caso fue agregar export GPG_TTY=$(tty)a mis archivos de inicio de shell.

Sin embargo, no recibí el mensaje de error "Inactivo apropiado para el dispositivo" mencionado como indicador de esta solución en otra respuesta a esta pregunta.

Nota: Dado que la causa de obtener este error fue completamente diferente a la de aquellos que sugirieron export GPG_TTY=$(tty)antes (generalmente como una sugerencia) en otras respuestas a esta pregunta, decidí que esta pregunta necesita otra respuesta que mencione que export GPG_TTY=$(tty)puede ser la solución principal y única cosa necesaria en algunos casos.

Axel Beckert
fuente
¡Gracias! update-alternatives --config pinentryLo hice por mí. Estoy SSH'd en mi escritorio y pinentryse configuró en /usr/bin/pinentry-gnome3(que debería tener un respaldo TTY cuando SSH'd o cuando se cambia a una consola virtual). Pero no estaba funcionando, aparentemente. Establecer el valor predeterminado para /usr/bin/pinentry-ttyhacer el truco para mí. Puede que tenga que volver a configurarlo cuando vuelva a mi escritorio, pero, por ahora, estoy bien. export GPG_TTY=$(tty)no fue suficiente. Lo hice pero necesitaba cambiar pinentryantes de poder firmar mi confirmación.
Karl Wilbur
1

Lo que me resolvió fue asegurarme de que el nombre de la clave coincidiera con mi nombre de usuario git. Supongo que los correos electrónicos también deben coincidir. Esto podría tener que ver conmigo usando GPG KeyChain en mi Mac. No estoy seguro.

Pensé que estaba nombrando la clave cuando llené esto, pero supongo que estaba pidiendo mi nombre (nombre de usuario git).

Forma de llavero GPG

Jerinaw
fuente
Es una pena que esta respuesta esté tan retrasada que muchos no llegarán a buscar su problema.
MaciekS
1

Tuve este error en macos: para intentar solucionar los problemas, intenté enumerar las claves para ver si habían expirado usando gpg2 --list-keys. Verifiqué que las claves no habían expirado y que la clave correcta se configuró en mi configuración usando git config --global user.signingkey.

Después de ejecutar esos comandos, de repente pude hacer confirmaciones firmadas nuevamente sin problemas. No cambié mis archivos de configuración o claves, ni siquiera creé una nueva instancia de Terminal. Simplemente parecía que el gpg2 estaba de alguna manera en un estado extraño en mi mac.

joensson
fuente
0

Resolví el problema instalando y brew install gpg2luego haciendogit config --global gpg.program gpg2

cperez08
fuente
0

El mismo error también puede ser causado cuando ha expirado la clave en su configuración de git.

Verifique el contenido cat .git/configy busque el signingkeyvalor y verifique si está vencido. En caso afirmativo, actualícelo con el nuevo.

Prateek Jain
fuente
0

Si está utilizando una tarjeta inteligente / yubikey para almacenar su clave GPG y configura elsignkey de git mediante la clave almacenada en la tarjeta (y toda la respuesta anterior parece no resolver su problema), su PIN bloqueado de la tarjeta podría ser el causa raíz de este problema.

Para verificar el PIN bloqueado:

gpg --card-status

Si el contador es similar a

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

Entonces su PIN está bloqueado (después de 3 intentos fallidos).

Para desbloquear el 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
fuente
0

Para mi un simple brew unintstall gnupg && brew cask reinstall gpg-suite resuelve el problema.

Desinstala (en mi caso) manualmente el gpg instalado en homebrew y reinstala todo el GPG Suite.

blackjacx
fuente
0

En mi caso, tenía una configuración mixta de gpg y smimesign en la documentación de firma de compromiso aquí: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- llave

Después de trabajar en ello durante horas, descubrí que la mejor manera de corregirlo era desarmar todo lo relacionado con gpg y reconfigurar gpg.

Como se menciona en la respuesta de @Jason Thrasher, encuentre toda la configuración de git relacionada con gpg usando:

git config -l | grep gpg

Luego, desarme todo de forma golabial y local usando:

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

Luego reconfigure siguiendo la documentación oficial dada anteriormente. Espero que esto ayude.

Shubham Gupta
fuente
Además, estoy usando gpg2
Shubham Gupta
0

Si ya tenía configurada su pinentry y gpg, y dejó de funcionar de la nada:

Comprueba si tu gpg funciona:

echo "test" | gpg --clearsign

Si dice gpg: signing failed: No pinentry, simplemente reinicie el cliente gpg daemon, que se atasca de vez en cuando:

gpgconf --kill gpg-agent

Ahora debería estar funcionando:

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

En mi caso, este error ocurrió cuando se ejecutó git commiten una pequeña tmuxventana que no pudo ajustarse a la solicitud de frase de contraseña.

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

Esto te ayudará a deshacerte de él

git config commit.gpgsign false

nmanikumar5
fuente
1
No entiendo el voto negativo, resolvió el problema propuesto como un encanto para mí.
Jms
2
Este comando debe ser evitado. Solo eliminará el requisito de firmar el git commit, no resolverá el problema de autenticar a la persona que realiza el commit.
Kyle