the keys gpg generation failed error data create git github gpg-signature

git - keys - gpg no pudo firmar los datos fatales: no se pudo escribir el objeto de confirmación



my gpg key (28)

Seguí algunos artículos sobre los pretty atributos en la nota de lanzamiento de Git 2.10 . A través de la cual se actualizó el git a 2.10.0 e hizo cambios en el .gitconfig global que resultó de la siguiente manera:

[filter "lfs"] clean = git-lfs clean %f smudge = git-lfs smudge %f required = true [user] name = xyz email = [email protected] signingkey = AAAAAAA [core] excludesfile = /Users/xyz/.gitignore_global editor = ''subl'' --wait [difftool "sourcetree"] cmd = opendiff /"$LOCAL/" /"$REMOTE/" path = [mergetool "sourcetree"] cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh /"$LOCAL/" /"$REMOTE/" -ancestor /"$BASE/" -merge /"$MERGED/" trustExitCode = true [alias] lg = log --graph --pretty=format:''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'' --abbrev-commit --date=relative [color "diff"] old = red strike new = green italic

Pero ahora que trato de firmar mis confirmaciones usando

git commit -a -S -m "message"

Veo el siguiente error:

Necesita una frase de contraseña para desbloquear la clave secreta para

usuario: "XYZ (firmado digitalmente)"

Clave RSA de 2048 bits, ID AAAAAAAA, creada el 2016-07-01

error: gpg no pudo firmar los datos fatales: no se pudo escribir el objeto de confirmación

Nota - Todavía puedo confirmar cambios usando git commit -a -m "message"

¿Hay alguna manera de superar lo mismo? ¿O algún cambio requerido en las configuraciones de gpg para llevarse bien con la actualización de git?

Actualización 1

También buscando mayor utilidad, siguiendo ¿Hay alguna forma de "auto firmar" confirmaciones en Git con una clave GPG? . Ya he configurado la clave usando

git config --global user.signingkey ED5CDE14(with my key) git config --global commit.gpgsign true

y obviamente obtenemos el mismo error de todos modos.


Actualización de octubre de 2016: el problema 871 mencionó "La firma dejó de funcionar en Git 2.9.3"

Git para Windows 2.10.1 lanzado hace dos días (4 de octubre de 2016) ha solucionado la firma de GPG interactiva de confirmaciones y etiquetas.

El reciente cambio de signo de gpg en git (que no presenta ningún problema en Linux) expone un problema en la forma en que, en Windows, no MSYS2-git interactúa con MSYS2-gpg.

Respuesta original:

Leyendo " 7.4 Herramientas Git - Firmando su trabajo ", supongo que tiene configurada su configuración " user.signingkey ".

La última gran refactorización (antes de Git 2.10) alrededor de gpg fue en commit 2f47eae2a , aquí ese mensaje de error se movió a gpg-interface.c

Un registro en ese archivo revela el cambio reciente en commit af2b21e (Git 2.10)

gpg2 ya usa el formato largo por defecto, pero la mayoría de las distribuciones todavía parecen tener "gpg" como la versión 1.x anterior debido a razones de compatibilidad. Y las versiones anteriores de gpg solo muestran la ID corta de 32 bits, que es bastante insegura.

En realidad, esto no importa para la verificación en sí: si la verificación pasa, la firma pgp es buena.
Pero si aún no tiene la clave y desea obtenerla, o si desea verificar exactamente qué clave se utilizó para la verificación y desea verificarla, debemos especificar la clave con más precisión.

Por lo tanto, compruebe cómo especificó su configuración user.signingkey y la versión de gpg que está utilizando (gpg1 o gpg2), para ver si tienen algún efecto en el mensaje de error.

También hay commit 0581b54 que cambia la condición para que el gpg failed to sign the data mensaje de error de gpg failed to sign the data (en complemento de commit 0d2b664 ):

Actualmente no leemos nada de stderr. Sin embargo, querremos hacerlo en un parche futuro, por lo que esto también nos prepara allí (y en ese caso gpg escribe antes de leer toda la entrada, aunque de nuevo, es poco probable que un uid clave llene un búfer de tubería).

Commit 4322353 muestra que gpg ahora usa un archivo temporal, por lo que podría haber problemas correctos al respecto.

Vamos a convertir el uso de un objeto temporal, que maneja los casos difíciles para nosotros, y agreguemos la llamada de limpieza que falta.


Al igual que @birchlabs, después de mucho cavar / buscar, descubrí que no era GPG, sino GPG Suite. cask reinstall gpg-suite y lo resolvió por mí.


Asegúrese de tener su correo electrónico configurado correctamente.

su mkdir temp mv /usr/local/lib/libreadline* temp ldconfig


Compruebe si gpg está habilitado con el siguiente comando

git config -l | grep gpg

si devuelve verdadero, ejecute el siguiente comando para deshabilitarlo

git config --global --unset commit.gpgsign

Después de ejecutar con éxito el comando anterior, debería poder ejecutar el comando git commit.


Debo haber actualizado accidentalmente gpg de alguna manera porque obtuve esto después de intentar probar si gpg funciona:

gpg: WARNING: server ''gpg-agent'' is older than us (2.1.21 < 2.2.10) gpg: Note: Outdated servers may lack important security fixes. gpg: Note: Use the command "gpgconf --kill all" to restart them.

Ejecutar gpgconf --kill all arregló por mí.

Espero que esto ayude a alguien.


El rastro git fue muy revelador para mi situación ...

GIT_TRACE=1 git commit -m "a commit message"

13:45:39.940081 git.c:344 trace: built-in: git commit -m ''a commit message'' 13:45:39.977999 run-command.c:640 trace: run_command: gpg --status-fd=2 -bsau ''full name <[email protected]>'' error: gpg failed to sign the data fatal: failed to write commit object

Necesitaba generar una clave inicial según el formato con el que git estaba comprobando. Es mejor copiar el valor pasado a -bsau arriba en los registros tal como está y usarlo a continuación.

Entonces se convierte,

gpg --quick-generate-key "full name <[email protected]>"

Entonces funcionó.

Espero que ayude.


En mi caso, ninguna de las soluciones mencionadas en otra respuesta funcionó. Descubrí que el problema era específico de un repositorio. Eliminar y clonar el repositorio nuevamente resolvió el problema.


Estoy en Ubuntu 18.04 y recibí el mismo error, también estuve preocupado durante semanas. Finalmente me di cuenta de que gpg2 no apunta hacia nada. Así que simplemente corre

git config --global --unset commit.gpgsign

Y tada, funciona a las mil maravillas.

Sus confirmaciones ahora tendrán una etiqueta verificada con ellos.


Intenté algunas sugerencias pero no tuve suerte, y terminé con esto. Sé que esto no es perfecto, pero solo quiero volver a mi trabajo lo antes posible.

git config commit.gpgsign false


Las respuestas anteriores son geniales, pero no me funcionaron. Lo que resolvió mi problema fue exportar las claves públicas y secretas .

enumerar las claves de la máquina desde donde estamos exportando

brew update brew upgrade git brew install gpg # the following are suggestions from brew''s Caveats, to make `/usr/local/bin/gpg` # point to the brew binary: rm ''/usr/local/bin/gpg'' brew link --overwrite gnupg2

exportar las llaves

🍔 which gpg /usr/local/bin/gpg 🍔 ls -l /usr/local/bin/gpg lrwxr-xr-x 1 burger admin 33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

ir a la máquina que estamos importando e importar

git config --global gpg.program gpg

bingo bongo, ya terminaste!

referencia: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

PD. Mis claves se hicieron originalmente en Windows 7 bootcamp y las exporté a mi Mac Air (la misma máquina física, virtualmente diferente)


Lo he hecho a través de esta receta corta y fácil :

Las confirmaciones de firma automática en MacOS (globalmente y con diferentes IDE):

Obtenga su signingkey de signingkey de esta manera .

brew install gnupg gnupg2 pinentry-mac git config --global user.signingkey <YOUR_SIGNING_KEY> git config --global commit.gpgsign true git config --global gpg.program gpg

Ponga lo siguiente en el archivo gpg.conf (edite el archivo con el comando nano ~/.gnupg/gpg.conf ):

no-tty

Ponga lo siguiente en el archivo gpg-agent.conf (edite el archivo con el nano ~/.gnupg/gpg-agent.conf ):

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


Me encontré con este problema con OSX.

Respuesta original:

Parece que una actualización de gpg (de brew) cambió a la ubicación de gpg a gpg1 , puede cambiar el binario donde git busca el gpg:

git config --global gpg.program gpg1

Si no tiene gpg1: brew install gpg1 .

Respuesta actualizada:

Parece que gpg1 está en desuso / "fuera de uso suavemente" , por lo que probablemente debería actualizar a gpg2, desafortunadamente esto implica bastantes pasos más / un poco de tiempo:

brew upgrade gnupg # This has a make step which takes a while brew link --overwrite gnupg brew install pinentry-mac echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf killall gpg-agent

La primera parte instala gpg2, y la última es un hack requerido para usarlo . Para la solución de problemas, consulte esta respuesta (aunque se trata de Linux no se prepara), sugiere una buena prueba:

echo "test" | gpg --clearsign # on linux it''s gpg2 but brew stays as gpg

Si esta prueba es exitosa (ningún error / salida incluye la firma PGP), ha actualizado con éxito a la última versión de GPG.

¡Ahora debería poder volver a usar la firma git!
Vale la pena señalar que necesitará tener:

git config --global gpg.program gpg # perhaps you had this already? On linux maybe gpg2 git config --global commit.gpgsign true # if you want to sign every commit

Nota: Después de ejecutar una confirmación firmada, puede verificar que se haya firmado con:

git log --show-signature -1

que incluirá información de gpg para la última confirmación.


Me topé con este error no por ningún problema de configuración, sino porque mi clave había caducado. La forma más fácil de extender su validez en OSX es abrir la aplicación GPG Keychain (si la tiene instalada) y automáticamente le solicitará que la extienda. Dos clics y listo. Esperemos que esto ayude a otros Googlers :)


Mis dos centavos aquí:

Cuando crea y agrega una clave a gpg-agent, define algo llamado passphrase . Ahora esa passphrase de passphrase caduca en algún momento, y gpg necesita que la ingrese nuevamente para desbloquear su clave y poder comenzar a firmar nuevamente.

Cuando usa cualquier otro programa que interactúa con gpg , no aparece la solicitud de gpg para que ingrese su frase de contraseña (básicamente, gpg-agent cuando está demonizado no puede mostrarle el diálogo de entrada en stdin ).

Una de las soluciones es gpg --sign a_file.txt luego ingresa la frase de contraseña que ingresaste cuando creaste tu clave y luego todo debería estar bien ( gpg-agent debería firmar automáticamente)

Vea esta respuesta sobre cómo establecer tiempos de espera más largos para su frase de contraseña para que no tenga que hacer esto todo el tiempo.

O puede eliminar completamente la frase de contraseña con ssh-keygen -p


Ninguna de las respuestas anteriores parecía coincidir con mi problema. Mi binario gpg ( /usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2 ) se instaló como parte de gpgtools.org , en lugar de hacerlo por brew.

Sin embargo, sentí que el consejo se reducía a: "usar el binario gpg sea ​​el último disponible en brew". Entonces intenté:

brew uninstall gpg brew install gpg2

Verifiqué que había cambiado correctamente el gpg en mi $PATH para señalar el nuevo ejecutable de brew:

git config --global gpg.program gpg

Y también le dije explícitamente a git qué binario gpg usar:

git config commit.gpgsign false

Bueno, tal vez eso no sea completamente hermético, ya que es sensible al camino. En realidad, no fui tan lejos como para confirmar sin lugar a dudas que git había cambiado a invocar el brebaje gpg .

En cualquier caso: nada de esto fue suficiente para que git commit firme con éxito mis confirmaciones nuevamente.

Lo que funcionó para mí en última instancia fue actualizar GPG Suite . Estaba ejecutando la versión 2016.7, y descubrí que la actualización a 2016.10 me solucionó el problema.

Abrí GPG Keychain.app y presioné "Buscar actualizaciones ...". Con la nueva versión: los commits firmados volvieron a funcionar correctamente.


Para cualquiera que esté enfrentando este problema en máquinas MacOS , intente esto:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac (si es necesario)
  4. gpg --full-generate-key Crea una clave usando un algoritmo.
  5. Obtenga la clave generada ejecutando: gpg --list-keys
  6. Establezca la clave aquí git config --global user.signingkey <Key from your list>
  7. git config --global gpg.program /usr/local/bin/gpg
  8. git config --global commit.gpgsign true
  9. Si desea exportar su clave a GitHub, entonces: gpg --armor --export <key> y agregue esta clave a GitHub en las claves GPG: https://github.com/settings/keys (con la línea START y END incluidas)

Si el problema persiste:

test -r ~/.bash_profile && echo ''export GPG_TTY=$(tty)'' >> ~/.bash_profile

echo ''export GPG_TTY=$(tty)'' >> ~/.profile

Si el problema persiste:

Instale gpgtools.org y firme la clave que utilizó presionando Firmar en la barra de menú: Clave -> Firmar

Si el problema persiste:

Vaya a: su archivo global .gitconfig que en mi caso está en: /Users/gent/.gitconfig Y modifique el archivo .gitconfig (asegúrese de que Correo electrónico y Nombre coincidan con el que creó mientras Generando la clave) :

[user] email = [email protected] name = Gent signingkey = <YOURKEY> [gpg] program = /usr/local/bin/gpg [commit] gpsign = true gpgsign = true [filter "lfs"] process = git-lfs filter-process required = true clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f [credential] helper = osxkeychain



Puede ayudar a matar el proceso gpg-agent que podría quedarse con datos antiguos. Entonces, el nuevo gpg-agent iniciado solicitaría una contraseña


Recibí este error en Ubuntu 18.04 y resultó que mi clave había caducado .

Para ver esto, ejecuté esto y confirmó que mis claves habían caducado:

git config --global user.email "[email protected]"

Para corregir esto, ejecuté (usando la ID que se muestra en el comando anterior):

$ gpg --version gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

A partir de ahí, extendí la caducidad de la key 0 y la key 1 siguiendo estas instrucciones que se redujeron a escribir la key 0 luego expire y siguiendo las indicaciones. Luego repitiendo para la key 1 .

Después, para probar esto, corrí:

ls /usr/local/lib

Y antes de la solución, falló con el error:

gpg: sin clave secreta predeterminada: sin clave secreta
gpg: [stdin]: error de firma clara: sin clave secreta

Pero después de la corrección, el mismo comando firmó con éxito el mensaje, ¡así que supe que las cosas estaban funcionando nuevamente!


Si el correo electrónico asociado al uid de su clave GPG es diferente al correo electrónico que está utilizando en git, deberá agregar otra identificación de usuario a su clave O utilizar una clave que coincida exactamente con el correo electrónico.

Puede agregar otro UID usando:

$ gpg - clave de edición

Ver para más https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails


Si esto sucedió al azar y ha funcionado perfectamente en el pasado, como es mi caso, intente cerrar sesión ( cmd+shift+q ) e iniciar sesión nuevamente. Funcionó para mí



Si todo falla, use GIT_TRACE=1 para probar y ver qué está haciendo realmente git:

$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user" 20:52:58.902766 git.c:328 trace: built-in: git ''commit'' ''-vvv'' ''-m'' ''Add page that always requires a logged-in user'' 20:52:58.918467 run-command.c:626 trace: run_command: ''gpg'' ''--status-fd=2'' ''-bsau'' ''23810377252EF4C2'' error: gpg failed to sign the data fatal: failed to write commit object

Ahora ejecute el comando de falla manualmente:

$ gpg -bsau 23810377252EF4C2 gpg: skipped "23810377252EF4C2": Unusable secret key gpg: signing failed: Unusable secret key

Resulta que mi llave expiró, git no tenía la culpa.


Siga la siguiente URL para configurar la confirmación firmada https://help.github.com/en/articles/telling-git-about-your-signing-key

si todavía obteniendo gpg no se pudo firmar la información fatal: no se pudo escribir el objeto commit

esto no es un problema con git, esto es con GPG, siga los pasos a continuación

1. gpg --version

  1. echo "test" | gpg --clearsign

si se muestra:

gpg: signing failed: Inappropriate ioctl for device gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device

  1. luego use export GPG_TTY=$(tty)

4.entonces vuelva a intentar echo "test" | gpg --clearsign echo "test" | gpg --clearsign en el que se obtiene la firma PGP.

  1. git config -l | grep gpg

gpg.program = gpg commit.gpgsign = true

6.aplicar git commit -S -m "commitMsz"


Tuve el mismo problema. Me complace informar que el problema no radica en git 2.10.0 sino en gnupg 1.4.21 .

La degradación temporal de gnupg a 1.4.20 solucionó el problema para mí.

Si está utilizando homebrew y actualizó sus paquetes como lo hice yo, probablemente pueda ejecutar brew switch gnupg 1.4.20 para volver atrás.


Tuve un problema similar con las últimas fuentes de Git (2.12.2) creadas junto con las últimas fuentes de todas sus dependencias (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring, etc.).

Resulta que libreadline estaba dando problemas a GnuPG:

$ gpg --list-keys /home/user/.gnupg/pubring.gpg -------------------------------- pub 1024D/ABCDFE01 2008-04-13 uid firstname lastname (description) <[email protected]> sub 2048g/DEFABC01 2008-04-13

Y, por supuesto, el intento de obtener información útil de Git con -vvv falló, por lo que el fracaso fue un misterio.

Para resolver la falla de PGP debido a ReadLine, siga las instrucciones en No se puede actualizar o usar el administrador de paquetes - error de gpg :

En terminal:

$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01 $ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

había un montón de bibliotecas readline allí (libreadline.so.BLAH-BLAH), así que yo:

$ gpg --import ~/mygpgkey_pub.gpg $ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg


Usando cygwin, recientemente gpg2 a gpg2 . Luego tuve el mismo problema para firmar con git después de configurar git config gpg.program gpg2 .

Prueba echo "test" | gpg2 --clearsign echo "test" | gpg2 --clearsign para ver si gpg2 está funcionando. Me pareció la solución más fácil simplemente configurar git config gpg.program gpg , porque eso funciona. Pero también obtendrá un mejor error de esta manera, por ejemplo, que necesita instalar pinentry.


lo configuró simplemente:

git config -l | grep gpg