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:
-
brew uninstall gpg
-
brew install gpg2
-
brew install pinentry-mac
(si es necesario) -
gpg --full-generate-key
Crea una clave usando un algoritmo. -
Obtenga la clave generada ejecutando:
gpg --list-keys
-
Establezca la clave aquí
git config --global user.signingkey <Key from your list>
-
git config --global gpg.program /usr/local/bin/gpg
-
git config --global commit.gpgsign true
-
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
Podría ser un agente de gpg colgante.
Pruebe
gpgconf --kill gpg-agent
como se describe aquí
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 se utilizan gnupg2 y gpg-agent 2.x, asegúrese de configurar la variable de entorno
GPG_TTY
.
export GPG_TTY=$(tty)
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
-
echo "test" | gpg --clearsign
si se muestra:
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
-
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.
-
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