Git错误-gpg无法签名数据


148

我刚开始使用git,并通过自制软件安装了git和gpg。出于某种原因,当git commit 我查看有关此主题的许多其他stackoverflow问题时,都收到此错误,但没有一个对我有用。如何解决此错误,以便我可以成功上传。

error: gpg failed to sign the data
fatal: failed to write commit object

3
对于Mac用户。我有这个问题。本页上的建议帮助我意识到我可能已经安装了两个gpg版本,并且确实做到了。一种来自Brew,另一种来自GPG Suite。我想使用GPG Suite,因为它允许在系统钥匙串中缓存密码短语。卸载brew版本可以解决我的问题。以及@sideshowbarker关于杀死gpg-agent的答案。因此,我认为每个配置都相互干扰。
Michael Welch



我只是遇到了gpg签名的问题,问题是我的git repo没有设置本地gpg.signingkey,但全局的是。因此,只需将其设置git config --local user.signingkey为正确的密钥,它将再次自动签名。可能会和git config --global --unset user.signingkey
MarcusJ

Answers:


208

对于故障排除,首先要尝试两件事:

  • 运行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

保存~/.gnupg目录副本的原因是,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

运行第二个命令时出现此错误:gpg:没有默认密钥:没有密钥gpg:[stdin]:clearsign失败:没有密钥
2016年

@Entitize这似乎表明gpg认为您没有任何可用于签名的密钥。请参阅我添加到答案中的其他步骤。如果您从来没有跑步gpg2 --gen-key过,那是您首先需要做的。
sideshowbarker

2
当我运行echo“ test” | gpg2 --clearsign,它给我:gpg-agent [-]:命令get_passphrase失败:设备gpg的ioctl不适当:代理问题:设备gpg的ioctl不适当:没有默认密钥:操作已取消gpg:[stdin]: clearsign失败:操作已取消。我尝试了许多其他可能性,但没有任何效果。没有GPG,有没有办法使用GIT!
2016年

9
你可以试试看export GPG_TTY=$(tty)。至于有没有gpg的情况下使用git的方法,您应该可以在默认情况下做到这一点,或者仅通过运行git config --global commit.gpgsign false全局取消提交的gpg签名即可。
sideshowbarker

10
在Mac OS X中,我开始使用进行调试echo "test" | gpg2 --clearsign,发现了一个错误,并将其引导至该线程,从而解决了我的问题:我只是将一个文件export GPG_TTY=$(tty)放入了˜/.bash_profile文件中,然后重新加载了source ˜/.bash_profile
herrera

71

Git需要知道用哪个密钥签名。

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

git config --global user.signingkey EB11C755

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

git config --global commit.gpgsign true

7
我只是遇到这种情况,以防其他人愚蠢地做我所做的事情:确保将其拼写为“ signingkey”而不是“ signinkey”。
ZNK

1
从字面上看,@ ZNK的评论对我有用。我将其拼写为“ signkey”而不是“ signingkey”
jzatt

1
可接受的答案应该将此作为第一步的故障排除步骤,因为有时您已经拥有所有密钥,只是git忘记了要使用哪个密钥。
f055

41

以某种方式将您的git配置为GPG对每次提交进行签名。使用GPG签名不需要提交或推送。由于尚未配置您的gpg签名机制,因此很可能出现错误。

如果您是git的新手,请尝试使其首先工作而不先进行GPG签名,然后在确实需要时添加登录。

您可以通过执行以下操作来验证有关gpg的git配置方式:

git config -l | grep gpg

可能会产生零个或多个行,包括:

commit.gpgsign=true

如果“ commit.gpgsign”为true,则您已启用gpg签名。通过以下方式禁用它:

git config --global --unset commit.gpgsign

然后尝试再次运行提交。现在,它应该在没有gpg签名的情况下运行。基本的git工作之后,您应该尝试将gpg签名重新添加到混合中。


12
太棒了!git config --global --unset commit.gpgsign为我工作:)
hpaknia'7

哇!!它对我有用:git config --global --unset commit.gpgsign
Hardy Mathew

32

请参阅@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 

... /。gnupg / pubring.gpg

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

git config --global user.signingkey 0A61C6FC

由我的同事提醒,需要附加

export GPG_TTY=$(tty)

到〜/ .zshrc(如果使用zsh),否则附加到〜/ .bash_profile


对于macOS,

gpg2与brew中的gpg合并,因此gpg命令指向gpg2

brew install gpg2

酿造信息gpg

gnupg:稳定的2.2.6(瓶装)

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

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

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

加线

pinentry程序/ usr / local / bin / pinentry-mac


1
macOS 10.15(Catalina)随附GnuPG 2.2.17版,因此除非您计划自己管理更新,否则无需单独安装它。
乔什·哈布达斯

18

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

export GPG_TTY=$(tty)

2
我在MacOS Catalina上使用zsh,这是我需要使其生效的唯一更改。谢谢。
JP Lew

将密钥复制到WSL环境后,我在OP中收到错误消息,事实证明,我需要这样做以提示输入密钥密码。谢谢。
narwic

10

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

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

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

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

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

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

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

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

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


每当我尝试运行没有到期日期的gpg密钥时,我都会遇到这个问题。由于某些原因,git不喜欢这样。使用此方法添加到期日期(无论将来多远)似乎都可以解决该问题。
some_guy632

完成后,别忘了save在gpg提示符下输入!
daviewales

5

这对我在ubuntu 18.04上起作用

检查您的gpg密钥

gpg -K --keyid-format LONG

如果收到空白响应,请生成GPG密钥

gpg --generate-key

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

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]

设置git唱歌键

git config --global user.singingkey 95A854E0593B3214

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

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

git config commit.gpgsign false

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


“或者,如果您不介意使用ssh密钥进行签名”,则ssh与签名有什么关系?
riffraff

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

4

我不得不将gpg.program修复为gpg的绝对路径:

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

我将Windows与cygwin一起使用。


3
这是我的解决方案。我已经用Chocolatey安装了gnupg。
Alex S

谢谢,也为我工作。我完成了choco install gpg4win
Gokul NC

4

解:

Issue: Disabled loopback pinentry mode

要解决此问题,您需要在〜/ .gnupg / gpg.conf中启用回送针入模式:

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

use-agent 
pinentry-mode loopback

EOF

也在〜/ .gnupg / gpg-agent.conf中(如果尚不存在,则创建文件):

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

allow-loopback-pinentry

EOF

然后使用重新启动代理,echo RELOADAGENT | gpg-connect-agent您应该一切顺利!

资源


1
哇,花了几个小时尝试所有可能的解决方案后,这解决了我的问题,谢谢!
马特·

别客气。实际感谢来源。我也被困住了。
拉胡尔塔库尔

3

当您的GPG密钥过期时,也会发生此错误。生成新密钥并将其添加到Git应该可以解决此问题。


3

升级到gnupg 2.x后,我遇到了这个问题。可以看出gpg2引用键的方式有所不同:我仍然有signingkey = ABC98F11(gpg v1设置)~/.gitconfig。gpg2的键标识符更长。用它们查找gpg --list-secret-keys


1

我已经git用3个单独的键制作了一个密钥,其中certify/ sign/ encrypt和该密钥显示为已过期(在正常工作几天后):

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     ]

无需添加单独的子键即可解决此问题。


1

可能是您的Git配置设置为gpgsign = true。如果您不想分配提交,请尝试将其设置为false。转到您的存储库文件夹并更改文件

纳米.git / config

由此...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

为此...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false

1

对我来说,git tag -s当我切换pinentry-gnome3pinentry-curses(使用update-alternatives --config pinentry)以便于远程访问时,这个错误开始在Debian GNU / Linux上发生。它仅与一起发生git tag -s,而不与gpg(例如gpg --clearsign)本身一起发生。

使它在这种情况下再次起作用的唯一必要更改是将其添加export GPG_TTY=$(tty)到我的Shell启动文件中。

尽管在此问题的另一个答案中,我没有得到“此设备的不适当的ioctl”错误消息作为此修复程序的指示。

注意:由于导致此错误的原因与export GPG_TTY=$(tty)之前提出该问题的其他答案(通常作为附带提示)的原因完全不同,因此我决定此问题需要另一个答案,其中提到这export GPG_TTY=$(tty)可能是主要解决方法,在某些情况下唯一必要的事情。


谢谢!update-alternatives --config pinentry为我做了。我已通过SSH进入我的桌面并pinentry设置为/usr/bin/pinentry-gnome3(当SSH进入或切换到虚拟控制台时,它应该具有TTY后备功能)。但这显然没有用。设置默认值/usr/bin/pinentry-tty对我有用。当我回到桌面时,可能必须将其设置回去,但是到目前为止,我还不错。export GPG_TTY=$(tty)还不够。我做到了,但是需要切换pinentry才能签名。
卡尔·威尔伯

1

为我解决的是确保密钥的名称与我的git用户名匹配。我认为电子邮件也必须匹配。这可能与我在Mac上使用GPG KeyChain有关。不确定。

我以为我在填写时要命名该密钥,但是我想它是在问我的名字(git用户名)。

GPG钥匙扣形式


遗憾的是,这个答案远远落后于许多人不会来这里寻找他们的问题。
MaciekS

1

我在macOS上遇到此错误-尝试进行故障排除,并尝试列出密钥,以查看它们是否已使用gpg2 --list-keys-我验证了密钥未过期,并且使用config在我的配置中设置了正确的密钥git config --global user.signingkey

运行完这些命令后,我突然能够再次进行签名提交而没有问题。我没有更改配置文件或密钥-甚至没有创建新的Terminal实例。好像gpg2在我的Mac上处于某种奇怪的状态。


0

我解决了安装brew install gpg2后的问题git config --global gpg.program gpg2


0

当您的git配置中的密钥过期时,也可能导致相同的错误。

请检查的内容cat .git/config并寻找signingkey价值,并检查其是否过期。如果是,则用新的更新。


0

如果您使用智能卡/ yubikey存储GPG密钥,并且signkey通过存储在卡中的密钥设置git config的值(并且上述所有答案似乎都无法解决您的问题),则该卡的受阻PIN可能是此问题的根本原因。

要检查被阻止的PIN:

gpg --card-status

如果计数器类似于

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

然后,您的PIN码将被阻止(3次失败尝试后)。

要解除锁定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

0

对我来说,一个简单的方法brew unintstall gnupg && brew cask reinstall gpg-suite可以解决问题。

它会卸载(以我为例)手动执行自制程序的gpg,然后重新安装整个GPG Suite。


0

就我而言,我在这里的提交签名文档中给出了混合的gpg配置和smimesign配置:https ://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-

在工作了几个小时之后,我发现纠正它的最佳方法是取消与gpg相关的所有操作,然后重新配置gpg。

如@Jason Thrasher的答案中所述,使用以下命令查找与gpg相关的所有git配置:

git config -l | grep gpg

然后使用以下命令取消所有设置以及本地设置:

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

然后按照上面给出的官方文档进行重新配置。希望这可以帮助。


另外,我使用的是gpg2
Shubham Gupta,

0

如果您之前已经设置了pinentry和gpg,但是它突然消失了:

检查您的gpg是否有效:

echo "test" | gpg --clearsign

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

gpgconf --kill gpg-agent

现在它应该可以工作了:

echo "test" | gpg --clearsign

0

就我而言,此错误是在无法容纳密码提示git commit的小tmux窗口上运行时发生的。

$ 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

-6

这将帮助您摆脱它

git config commit.gpgsign false


1
我不明白这次的否决票,它对我来说就像个魅力一样解决了提议的问题。
Jms,

2
应避免使用此命令。它将仅删除对git commit签名的要求,而不会解决对进行提交的人员进行身份验证的问题。
凯尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.