Git错误- gpg签署数据失败

我刚开始使用git,我通过homebrew安装git和gpg。 由于某种原因,当我执行git commit时得到这个错误 我看了很多关于这个话题的stackoverflow问题,但没有一个对我有用。 如何修复此错误以成功上传?< / p >

error: gpg failed to sign the data
fatal: failed to write commit object
171888 次浏览

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

  • 运行gpg --version,并确保安装了GnuPG版本2+(而不是版本1)
  • 运行echo "test" | gpg --clearsign,以确保gpg本身在工作

如果一切看起来都没问题,接下来要尝试的一件事是:

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

如果在安装之后,你重新尝试git commit,仍然得到一个“__abc1”;错误,做的事:

  • 运行gpgconf --kill gpg-agent来杀死任何可能被挂起的运行代理

否则,运行一些基本步骤来检查你是否有一个正常工作的GnuPG环境:

  • 运行gpg -K --keyid-format SHORT,检查至少有一个密钥对没有过期

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

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

如果你得到一个错误消息说“设备不合适的ioctl”,这样做:

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

你的git以某种方式配置为GPG签署每次提交。使用GPG签名不需要使用git提交或推送。它很可能会给出错误,因为您的gpg签名机制还没有配置。

如果您是git的新手,请尝试在一开始不使用GPG签名的情况下让它工作,然后在确实需要时添加签名。

你可以通过以下方法验证git是如何配置gpg的:

git config -l | grep gpg

它可以产生零或多行,包括:

commit.gpgsign=true

如果“提交。“Gpgsign”为真,则启用了GPG签名。禁用它:

git config --global --unset commit.gpgsign

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

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

在你设置了GPG、GPG -agent和你的GPG .conf文件(参见本指南)之后,你需要运行

git config --global user.signingKey EB11C755

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

git config --global commit.gpgsign true

$ gpg2 -K --keyid-format SHORT          # <-- Shows your keys, e.g.:
/home/<username>/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/0754B01E 2019-02-02 [SCA]             <--secret key
C396BF3771782D7691B0641145E11B080754B01E
uid         [ultimate] John Doe <user@domain.com>
ssb   rsa4096/A20AB8EC 2019-02-02 [E]               <--public key


sec   rsa4096/25C504D5 2019-02-02 [SCA] [revoked: 2020-06-01]
08BFF49B9E07E4B4B0C4946B645B6C1425C504D5
uid         [ revoked] John Doe <user2@domain.com>
uid         [ revoked] [jpeg image of size 2670]

其中A20AB8EC是你在这个例子中寻找的键ID。

我已经做了一个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     ]

在不添加单独子键的情况下创建一个新键来解决问题。

检查你的钥匙是否过期。一旦你修复了过期日期(不需要创建一个新的密钥,除非你想),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中应该可以解决这个问题。

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

假设gpg2通过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/0 a61c6fc 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-program /usr/local/bin/pinentry-mac

经同事提醒,需要追加

export GPG_TTY=$(tty)

~ /。ZSHRC如果使用zsh,否则追加到~/.bash_profile

可能你的Git配置被设置为gpgsign = true。如果你不想指定你的提交,试着把它设置为false。转到存储库文件夹并更改该文件

纳米. /配置

从这个……

[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

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

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

在这种情况下,让它重新工作所必需的唯一更改是将export GPG_TTY=$(tty)添加到我的shell启动文件中。

我虽然没有得到“不适当的ioctl for device”错误消息,在这个问题的另一个答案中提到了这个修复的指示器。

注意:由于得到这个错误的原因与之前在这个问题的其他答案中建议export GPG_TTY=$(tty)(通常作为附带提示)的原因完全不同,所以我决定这个问题需要另一个答案,其中提到export GPG_TTY=$(tty)可能是某些情况下的主要修复和唯一必要的东西。

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

这将帮助你摆脱它

git config commit.gpgsign false

我正在使用它。它支持zsh并在Windows for Linux子系统上工作:

export GPG_TTY=$(tty)

其他用户已经确认以上是MacOS所需的唯一更改(例如Catalina 10.15.7)。对于mac,将以上内容添加到~/.zshrc。

在使用WSL2的Windows中的Linux容器中也可以工作。

这在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.signingkey 95A854E0593B3214

然后你就可以开始了!(--global是可选的)

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

git config commit.gpgsign false

请注意,由于安全问题,不建议这样做herehere

我必须修好gpg。编程到gpg的绝对路径:

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

我正在使用Windows cygwin。

为我解决这个问题的方法是确保密钥的名称与我的git用户名匹配。我猜邮件也要匹配。这可能与我在Mac上使用GPG钥匙串有关。不确定。

当我填写这个时,我以为我是在命名密钥,但我猜它是在询问我的名字(git用户名)。

GPG Keychain form

当你的git配置中的key过期时,同样的错误也会引起。

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

如果你使用智能卡/ yubikey来存储你的GPG密钥,并且你通过存储在卡中的密钥设置了git配置的signkey(上面所有的答案似乎都不能解决你的问题),你的卡的PIN被阻塞可能是这个问题的根本原因。

检查被阻止的PIN码:

gpg --card-status

如果计数器类似于

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

然后你的密码就被屏蔽了(经过3次不成功的尝试)。

解锁密码:

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

我在macos上出现了这个错误-为了尝试和排除故障,我尝试使用gpg2 --list-keys列出键,看看它们是否已经过期-我验证了键没有过期,并且使用git config --global user.signingkey在我的配置中设置了正确的键。

在我运行这些命令之后,我突然能够再次毫无问题地进行签名提交。我没有改变我的配置文件或密钥-我甚至没有创建一个新的终端实例。我的mac上的gpg2似乎处于一种奇怪的状态。

解决方案:

Issue: Disabled loopback pinentry mode

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

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重新启动代理,你应该可以开始了!

< a href = " https://d。某人/ B5N noreferrer“rel = > < / >来源

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

它会手动卸载(在我的情况下)自定义安装的gpg,并重新安装整个gpg套件。

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

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

正如在@Jason Thrasher的回答中提到的,使用以下方法找到所有与gpg相关的git配置:

git config -l | grep gpg

然后取消所有的golable以及本地使用:

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

然后按照上面给出的官方文档重新配置。

如果你之前已经安装了pinentry和gpg,它突然就不工作了:

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

echo "test" | gpg --clearsign
如果它说gpg: signing failed: No pinentry, 只需重新启动GPG守护进程客户端,它会不时卡住:

gpgconf --kill gpg-agent

现在它应该工作了:

echo "test" | gpg --clearsign

在我的例子中,在一个小的tmux窗口上运行git commit时发生了此错误,该窗口无法适合密码短语提示。

$ 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

在我的情况下,我必须将存储在GitHub设置中的名称与键的名称和注释匹配。

所以如果gpg --list-keys返回uid [ultimate] Joe Blogs (fancy comment) <email@example.com>,你在.gitconfig中的名字应该是Joe Blogs (fancy comment)

最初,我把我的名字设置为Joe Blogs, GPG不会找到我的密钥并显示“无密钥”。strace错误。不幸的是,如果没有strace,这个错误就不会出现,并且会得到泛型

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

我刚刚在VSCode更新时遇到了这个问题。我认为GPG代理挂起了,因为该命令在出错之前运行了几秒钟。运行gpgconf --kill gpg-agent重置并为我修复了它。

对于我的带有GUI和gpg 2.2.19的Linux系统,无论是杀死gpg-agent(它会重新启动自己),还是取消设置$DISPLAY或设置$GPG_TTY都对我有效,因为它试图使用pinentry-gnome从控制台询问密码。我的钥匙还没有过期。

从SuperUser对类似问题的回答如何强制GPG使用控制台模式pin输入提示密码?来看,如果您的系统有GNOME这样的GUI,并且您的包管理器被配置为使用GUI pinentry程序,这就是为什么它挂起的原因,问题也会发生。

我不得不切换到pinentry-tty来让GPG再次为消息签名。在Ubuntu上,这可以通过下面链接中的步骤来完成:

sudo apt install pinentry-tty
sudo update-alternatives --config pinentry

第二个命令将向您显示pinentry程序列表,并要求您输入一个数字来选择一个,因此键入与pinentry-tty对应的数字,然后无需任何额外的工作,签名消息(和git提交)将再次工作。

我在linux/windows平台上都有这个问题,在我的情况下,我只需要更仔细地注意输出。这是令人难以置信的,因为我可以使用相同的设置在其他回购中签署提交。

git commit -m "test signing"
gpg: skipped "***63231079***": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object

我强调了“跳过”。线。请注意,有时当你克隆一个回购时,他们会分配一个密钥:这个问题让我很困惑,以至于我破坏了我可以访问的分叉回购,并在github上重新分叉。然后因为我在想“全局配置”;我从来没有想过要看本地回购配置,当我注意到这一点:

[user]
signingkey = 63231079

嗯,当然它不会工作nimrod, git默认为本地设置,所以这就是为什么你的密钥永远不会被拾取。我通过git config设置指针,它一直工作至今。

如果它曾经工作,只是声明失败,杀死代理,再试一次:

gpgconf --kill gpg-agent

检查代理是否再次启动:

echo "test" | gpg --clearsign

gpg是什么: GNU隐私保护

使用:

GPG是确保双方安全通信的一种极好的方法。它允许敏感信息在不安全的网络上轻松共享。

简单的解决方案:

步骤1:检查密钥是否过期请做

gpg -K——keyid-format SHORT

步骤2:如果它没有过期

Git配置——global user.signingkey

使用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

对我来说,我有error: gpg failed to sign the datafatal: failed to write commit object,因为Git出于某种原因默认使用< em > < >强smimesign,即使我取消设置gpg.x509.program键,并且< em > < >强smimesign找不到我的键

所以我必须显式地告诉Git使用< em > < >强gpg:

git config --local gpg.x509.program gpg

经过大量搜索,我发现gpg密钥是我的情况下的问题。

如果你的GPG密钥是正确的,你可以尝试运行gpg --status-fd=2 -bsau <your GPG key>

要更新正确的密钥,请执行以下操作: 检查键使用:gpg --list-secret-keys --keyid-format=long

它应该有以下输出:

/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot
ssb   4096R/42B317FD4BA89E7A 2016-03-10

然后更新密钥使用:

git config --global user.signingkey 3AA5C34371567BD2

现在再次检查提交,如果关键字是问题,它应该成功。您需要设置密码短语来更新密钥,您可以使用GitHub文档进行更新。

更多详细信息见:https://gist.github.com/paolocarrasco/18ca8fe6e63490ae1be23e84a7039374

对我有用的故障安全措施:重启我的机器。

这种做法很严厉,而且最终可能无法阻止问题再次出现。但我也遇到了同样的问题,尝试了几乎所有答案的解决方案,但运气不佳。

在这里添加它,希望它能解除其他人在我的情况:)

如果你使用的是windows powershell(5.1+),我想这个命令可以工作。

  1. 使用此命令获取GPG程序路径。
(Get-Command gpg).Path
  1. 在获取路径之后,复制路径。
  2. 使用这个命令
git config gpg.program <your path>

try to commit。 编码快乐! !< / p >