在Mac OS X上使用Git进行签名时出现错误:“gpg未能对数据进行签名”。

105

我从brew安装了GPG。

brew install gpg

这是gnupg2-2.0.30_2版本。

当我提交时,会收到错误信息:

You need a passphrase to unlock the secret key for
user: "Max Mustermann (mycomment) <mm@test.de>"
2048-bit RSA key, ID 1111AAAA, created 2017-01-05 

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

我使用了以下命令:

gpg --list-secret-keys | grep ^sec

然后它会返回给我:

sec   2048R/1111AAAA 2017-01-05

然后我使用了这个命令:

git config --global user.signingkey 1111AAAA

我提交(commit)时遇到了相同的错误消息,请问该如何解决这个问题?


1
同时,https://dev59.com/flkS5IYBdhLWcg3ww45d(可能重复) - DrBeco
https://dev59.com/TVgR5IYBdhLWcg3wp-u5(可能的重复问题) - DrBeco
1
我曾经遇到过类似的问题,尽管我的 GPG 密钥没有过期,在一年的稳定运行后出现了问题。我所需要做的就是运行 gpgconf --kill gpg-agent,然后它就可以正常工作了。 - Boštjan Biber
为什么这是一个 Stack Overflow 的问题(而不是 [unix.se])?这是一个命令行工具使用的问题,不是一个开发问题。 - Charles Duffy
9个回答

148

如果您完全没有被提示输入密码短语,解决方案可能只是安装一个程序来实现这一点。最常见的是pinentry

brew install pinentry-mac

因此安装它并再次尝试 可能会 让事情正常运转。但是如果不行,另一件要做的事情是确保 git 正在使用/找到正确的 GPG 程序。现在你真的应该使用 gpg2, 如果还没有安装,请执行以下操作:

gpg --version

确保您已安装 GnuPG 版本 2+(而不是版本 1)并指示版本信息。

如果您已经安装了 GnuPG 2+ 和 pinentry,请尝试以下操作:

echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf

…或更加健壮的:

echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf

...然后再次尝试。

同时您可能还需要停止gpg-agent

gpgconf --kill gpg-agent

当您需要时,您不需要手动重新启动它 - 它将自动重新启动。

注意:一些评论者提到在进行更改后需要重新启动计算机,但很可能这只会导致 gpg-agent 被重新启动。因此,按照上面描述的手动终止 gpg-agent 应该是足够的。


7
安装 pinentry-mac 解决了我的问题。谢谢! - Amazing Rando
6
我按照上述步骤操作,但需要重新启动才能生效。 - Sjuul Janssen
35
对我来说,重新启动 gpg-agent 就解决了问题,这样我就不需要重新启动:gpgconf --kill gpg-agent - phikes
23
我不得不杀死 gpg-agent 并使用 gpg-agent --daemon 重新启动它。 - Mohammad Banisaeid
1
最新的M1 Homebrew更改了bin目录,请使用以下命令:echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf - jqr
显示剩余8条评论

92

对于在 MacOS 设备上面出现此问题的任何人,请尝试以下操作:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac(如果需要)
  4. gpg --full-generate-key 使用算法创建密钥。
  5. 通过执行以下命令获取生成的密钥:gpg --list-keys
  6. 在此处设置密钥:git config --global user.signingkey <从列表中复制的密钥>
  7. git config --global gpg.program /usr/local/bin/gpg
  8. git config --global commit.gpgsign true
  9. 如果要将密钥导出到 GitHub,则使用以下命令:gpg --armor --export <key> 并将此密钥添加到GitHub的GPG密钥中:https://github.com/settings/keys(包括START和END行)

如果问题仍然存在:

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

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

如果问题仍然存在:

安装 https://gpgtools.org 并通过按以下步骤对使用过的密钥进行签名:Key->Sign(请确认邮件和名称与创建密钥时的相同)

如果问题仍然存在:

进入你的全局 .gitconfig 文件(在我的情况下是:‎⁨/Users/gent/.gitconfig) 并修改 .gitconfig 文件(请确保电子邮件和名称与生成密钥时的相同):

[user]
    email = gent@youremail.com
    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

p.s 我从这里的以前回答中提取了这个答案:gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0]


4
GPGTools让我成功了,它会提示输入口令并将其添加到钥匙串中 :) - CTS_AE
1
谢谢你!对我来说比当前被接受的答案好多了。 - GedankenNebel
使用GPGTools进行签名是解决我的问题的关键!难道没有一种使用gpg cli签署密钥的方法吗? - MbBrainz
请注意,“Stack Snippets”是我们本地的JSFiddle等效工具--它们仅适用于JavaScript、CSS、HTML和其他可以在浏览器中运行的代码。否则,请使用“{}”按钮而不是片段按钮。 - Charles Duffy
1
我缺少"gpg --full-generate-key"命令,这正是错误日志所抱怨的。非常感谢您详细的回答。 - Tobbey

8

我曾遇到同样的错误信息,并发现我的密钥已过期。 因此,建议您使用以下命令检查密钥是否过期:

gpg --list-keys

如果您的密钥也已过期,可以使用以下命令调整过期日期:

gpg --edit-key <YOUR_KEY>

然后执行以下操作:

gpg> expire
...enter the new expiration date...
gpg> save

1
许多答案提到使用 gpg --list-keys 来检查密钥是否存在,否则创建一个新的。但是没有人提醒注意过期日期。[expires: YYYY-MM-DD][expired: YYYY-MM-DD] 之间只有一个字符的差别,很容易被忽视。 - Simón

1
我在 macOS 上运行了 brew upgrade 命令,导致 git 中的 gpg 签名出现问题,可能是更新 gpg 包时出现了问题。我认为有一种更简单的方法可以强制 gpg 服务正确地重新启动(我猜升级包时某些正在运行的东西出了问题),但我的解决方法非常简单:只需重新启动计算机即可。

4
这件事情确实发生在我身上。需要迅速解决的进程是“killall gpg-agent”。 - Mike Hardy
1
@MikeHardy 真是太神了...我尝试了所有的方法,但这个意想不到的命令竟然解决了问题(在升级到 Monterey 后出现了这个问题)。 - Christophe Vidal

0
在我的情况下,user.signingkey 设置错误了...复制正确的签名密钥问题就解决了。

enter image description here


0

安装GPGSuite代替,它有用于生成密钥的图形用户界面。

您可以在这里查看更多详细信息。


0
如果您在 macOS 上仍然遇到问题, 请打开~/.gitconfig 并将[gpg]下面的任何内容更改为 program = /usr/local/bin/gpg

0
如果您在安装Xcode后遇到这个问题,可能是由于git二进制文件被替换了。(这种解决方案假定您正在使用homebrew管理git安装。)
症状:
  1. 您不需要输入密码
  2. 您的错误信息为:
    error: gpg 签名数据失败
    fatal: 写入提交对象失败
    
  3. $ git config --global gpg.program 报错
  4. 您看到的是系统自带的 git,而不是 homebrew 安装的 git:
    $ which git
    /usr/bin/git # 应该是 /usr/local/bin/git(homebrew 安装)
    $ ls -l $(which git)
    -rwxr-xr-x  1 root  wheel  167072 Feb  6  2022 /usr/bin/git
    # 应该是一个符号链接(symbolic link)(homebrew 安装):
    # lrwxr-xr-x  1 user  admin  28 Aug 16 12:11 /usr/local/bin/git -> ../Cellar/git/2.37.2/bin/git
    $ git --version
    git version 2.32.1 (Apple Git-133)
    
在这种情况下,解决方案是使用homebrew安装或重新安装git。
$ brew install git
# <output>
# then restart your terminal
$ ls -l $(which git)
lrwxr-xr-x  1 user  admin  28 Aug 16 12:11 /usr/local/bin/git -> ../Cellar/git/2.37.2/bin/git
$ git --version
git version 2.37.2

别忘了重新启动你的终端。


0
为了解决这个问题,而不需要在每次重启时关闭 gpg-agent
检查您是否有多个 gpggpg-agent 的副本:
$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent
/usr/local/MacGPG2/bin/gpg-agent

$ which -a gpg
/opt/homebrew/bin/gpg
/usr/local/bin/gpg
/usr/local/bin/gpg

对我来说,旧的Macbook迁移中安装了一些残留的二进制文件,它们是由MacGPG2安装的。

删除这些二进制文件(以及符号链接),并再次检查以确保只有一个副本:

$ which -a gpg
/opt/homebrew/bin/gpg

$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent

然后最后重新启动您的计算机。

gpg 应该可以正确签名,而无需终止任何进程:

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

test
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQIzBAEBCgAdFiEE1S8n.....
-----END PGP SIGNATURE-----

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接