Git错误 - gpg无法签署数据

Ent*_*ize 106 git gnupg

我刚开始使用git,我通过自制软件安装git和gpg.由于某种原因,我在得到这个错误时,git commit 我看了很多关于这个主题的其他stackoverflow问题,但没有一个对我有用.如何修复此错误以便我可以成功上传.

error: gpg failed to sign the data
fatal: failed to write commit object
Run Code Online (Sandbox Code Playgroud)

sid*_*ker 164

要进行故障排除,首先要尝试两件事:

  • 运行git config --global gpg.program gpg2,以确保git使用gpg2而不是gpg
  • echo "test" | gpg2 --clearsign,以确保gpg2自己的工作

如果这一切看起来都很好,那么接下来要尝试一下:

  • 运行brew install pinentry以确保为密码输入安装了一个好的工具

如果在安装之后又重新尝试git commit并仍然出现" failed to sign the data"错误:

  • 运行gpgconf --kill gpg-agent以杀死任何可能挂起的正在运行的代理程序

如果说gpgconf未安装或没有--kill选项,您可以尝试这样做:

  1. cp ~/.gnupg ~/.gnupg-GOOD~/.gnupg如果需要,保存您的副本以便稍后恢复
  2. brew install gnupg21 安装GnuPG 2.1

保存~/.gnupgdir 副本的原因是GnuPG 2.1可能以与GnuPG 2.0及更早版本不向后兼容的方式创建/更改某些关键数据,因此如果您想稍后返回,则可以执行此操作mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


否则,运行一些基本步骤来检查您是否有一个可用的GnuPG环境:

  • 运行gpg2 -K --keyid-format SHORT,检查您是否至少有一个密钥对

如果输出显示您没有GnuPG使用的密钥,那么您需要创建一个:

  • 运行gpg2 --gen-key,让GnuPG引导您完成创建密钥对的步骤

如果您收到错误消息"不适当的设备ioctl",请执行以下操作:

  • 运行export GPG_TTY=$(tty)和/或将其添加到您的~/.bashrc˜/.bash_profile

  • 在Mac OS X中,我开始使用`echo"test"调试 gpg2 --clearsign`,发现一个错误,它引导我[this thread](https://github.com/keybase/keybase-issues/issues/2798),这解决了我的问题:我只是把`export GPG_TTY = $(tty)`进入我的`〜/ .bash_profile`文件然后重新加载`source~/.bash_profile` (9认同)
  • 您可以尝试`export GPG_TTY = $(tty)`.至于是否有一种方法可以在没有gpg的情况下使用git,你应该能够默认执行此操作,或者只需运行`git config --global commit.gpgsign false`来全局取消设置你的提交的gpg签名. (3认同)
  • 这个`回声“测试” | gpg --clearsign` 让我走上了正轨。我的“代码”在 gpg 签名上失败,但运行后得到以下输出: ```-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 test gpg:signing failed: Screen or window toosmall gpg: [stdin]: clear-sign failed: 屏幕或窗口太小```所以我增加了终端窗口的大小_et voilå_ :-P (3认同)
  • 当我运行echo"test"| gpg2 --clearsign,它给了我:gpg-agent [ - ]:命令get_passphrase失败:设备gpg的不适当的ioctl:代理问题:设备gpg的不适当的ioctl:没有默认密钥:操作取消gpg:[stdin]:清除失败:操作已取消.我尝试了很多其他的可能性,但都没有工作.有没有办法在没有GPG的情况下使用GIT! (2认同)

Xav*_* Ho 57

Git需要知道它与哪个密钥签约.

设置GPG,gpg-agent和gpg.conf文件(请参阅本指南)后,您需要运行

git config --global user.signingkey EB11C755
Run Code Online (Sandbox Code Playgroud)

显然,最后用自己的公钥替换公钥.如果您希望默认情况下对每个提交进行签名,请使用

git config --global commit.gpgsign true
Run Code Online (Sandbox Code Playgroud)

  • 我只是遇到这种情况,以防其他人愚蠢地做我所做的事情:确保将其拼写为“ signingkey”而不是“ signinkey”。 (4认同)
  • 接受的答案应该将此作为第一个故障排除步骤,因为有时您所有的密钥都已经就位,只是 git 忘记了使用哪个密钥。 (3认同)

Jas*_*her 31

不知何故,你的git配置为GPG签署每个提交.使用git提交或推送不需要使用GPG进行签名.它可能会出错,因为您的gpg签名机制尚未配置.

如果你是git的新手,首先尝试让它在没有GPG签名的情况下首先运行,然后在你真正需要时添加签名.

您可以通过执行以下操作来验证git如何配置gpg:

git config -l | grep gpg
Run Code Online (Sandbox Code Playgroud)

这可能产生零线或多线,包括:

commit.gpgsign=true
Run Code Online (Sandbox Code Playgroud)

如果"commit.gpgsign"为true,则表示您已启用gpg签名.禁用它:

git config --global --unset commit.gpgsign
Run Code Online (Sandbox Code Playgroud)

然后尝试再次运行您的提交.现在应该在没有gpg签名的情况下运行.在你得到基本的git工作之后,你应该尝试添加gpg签名回混.

  • 真棒!`git config --global --unset commit.gpgsign`为我工作:) (8认同)

V-S*_*SHY 24

请参阅@sideshowbarker和@Xavier Ho解决方案,我通过以下步骤解决了我的问题.

假设brew安装了gpg2,

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 
Run Code Online (Sandbox Code Playgroud)

... /.GnuPG的/ pubring.gpg

sec rsa2048/0A61C6FC 2017-06-29 [SC] [expires:2019-06-29]

git config --global user.signingkey 0A61C6FC
Run Code Online (Sandbox Code Playgroud)

我的同事提醒,需要追加

export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)

到〜/ .zshrc如果使用zsh,否则追加到〜/ .bash_profile


对于macOS,

gpg2与brew中的gpg结合使用,因此gpg命令指向gpg2

brew install gpg2
Run Code Online (Sandbox Code Playgroud)

brew info gpg

gnupg:稳定2.2.6(瓶装)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 
Run Code Online (Sandbox Code Playgroud)

并且有passntry-mac用于密码输入

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf
Run Code Online (Sandbox Code Playgroud)

添加行

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

  • macOS 10.15 (Catalina) 附带 GnuPG 版本 2.2.17,因此无需单独安装它,除非您打算自行管理更新。 (3认同)

Jam*_*uri 9

我正在使用它。它支持zsha,并且可以在Linux的Windows子系统上运行:

export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)

  • 我在 MacOS Catalina 上使用 zsh,这是我需要让它工作的唯一更改。谢谢。 (8认同)
  • 这也是 Ubuntu 上通过 SSH 的解决方案 (2认同)
  • 通过 SSH,您可能需要找到您的 ssh tty(回显 $SSH_TTY)并将其也用于 GPG_TTY。 (2认同)

Rah*_*kur 9

解决方案:

Issue: Disabled loopback pinentry mode
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您需要在~/.gnupg/gpg.conf 中启用环回 pinentry 模式:

Issue: Disabled loopback pinentry mode
Run Code Online (Sandbox Code Playgroud)

并且还在~/.gnupg/gpg-agent.conf(如果文件不存在则创建该文件):

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

use-agent 
pinentry-mode loopback

EOF
Run Code Online (Sandbox Code Playgroud)

然后重新启动代理,echo RELOADAGENT | gpg-connect-agent你应该很高兴!

来源

  • 哇,花了几个小时尝试了所有可能的解决方案后,这解决了我的问题,谢谢! (2认同)

obo*_*zat 8

如果它曾经有效但只是显示失败,请终止代理并重试:

gpgconf --kill gpg-agent
Run Code Online (Sandbox Code Playgroud)

检查代理是否再次启动:

echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)


fty*_*ty4 7

我必须将 gpg.program 修复为 gpg 的绝对路径:

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Run Code Online (Sandbox Code Playgroud)

我正在使用带有 cygwin 的 Windows。

  • 这就是我的解决方案。我已经使用 Chocolatey 安装了 gnupg。 (3认同)

MCF*_*777 7

如果您之前设置过 pinentry 和 gpg,但它突然停止工作:

检查你的 gpg 是否正常工作:

echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)

如果显示gpg: signing failed: No pinentry,只需重新启动 gpg 守护进程客户端即可,该客户端有时会卡住:

gpgconf --kill gpg-agent
Run Code Online (Sandbox Code Playgroud)

现在它应该可以工作了:

echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)


lea*_*nne 6

检查您的密钥是否过期。一旦确定了失效日期(除非您愿意,否则无需创建新密钥),便git可以正常工作。

解决过期密钥的一种方法:

(注意:$代表命令行提示符,在提示符后键入命令;在每个命令后按Enter)

$ gpg2 --list-keys找到相应的密钥ID(后面的字符\pub线)

$ gpg2 --edit-key <key id> -这将打开gpg shell,提示更改为 gpg>

gpg> expire -按照说明为主键设置新的到期日期

接下来,如果有子项已过期(sub显示在行中),也要重置其失效日期:

gpg> key 1-选择第一个子项 gpg> expire-按照说明为子项设置新的到期日期

根据需要对每个后续子项重复。

  • 完成后,不要忘记在 gpg 提示符下输入“save”! (6认同)

poo*_*ert 6

这在 ubuntu 18.04 上对我有用

检查您的 gpg 密钥

gpg -K --keyid-format LONG
Run Code Online (Sandbox Code Playgroud)

如果你得到一个空白的响应,生成一个 GPG 密钥

gpg --generate-key
Run Code Online (Sandbox Code Playgroud)

重新运行第一个命令,你应该得到如下输出:

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]
Run Code Online (Sandbox Code Playgroud)

设置 git 签名密钥

git config --global user.signingkey 95A854E0593B3214
Run Code Online (Sandbox Code Playgroud)

那你就可以走了!(--global是可选的)

或者,如果您不介意使用 ssh 密钥进行签名

git config commit.gpgsign false
Run Code Online (Sandbox Code Playgroud)

请注意,根据此处此处的此问题,由于存在安全问题,因此不建议这样做

  • SSH 与签名提交没有任何关系。他们指的是关闭 GPG 提交签名,并在实际将提交推送到 git 服务器时依赖使用 SSH 密钥进行身份验证。您可以使用 SSH 身份验证推送(这很常见)来推送未签名的提交。 (3认同)

Kar*_*bwe 6

使用GIT_TRACE=1查看 Git 失败的位置,然后检查 Git 使用的所有自定义配置以及它们的定义位置,然后根据您的需要使用以下命令进行覆盖:

GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"

git config --list --show-scope --show-origin
Run Code Online (Sandbox Code Playgroud)

对我来说,我有error: gpg failed to sign the dataandfatal: failed to write commit object因为 Git 由于某种原因默认使用smimesign,即使我取消设置gpg.x509.programkey ,smimesign也找不到我的 key

所以我必须明确告诉 Git 使用gpg来代替:

git config --local gpg.x509.program gpg
Run Code Online (Sandbox Code Playgroud)