在OSX上,使用GPG进行git提交时无法正确签名

4

我一直在尝试使用 gitgpg 密钥进行工作,经过大量搜索和阅读文章后,唯一对我有效的方法是:

sudo rm /usr/local/bin/gpgsm
ln -s /usr/local/bin/gpg /usr/local/bin/gpgsm

这个技巧可以让git运行gpg命令而不是gpgsm命令,如下所示:
GIT_TRACE=1 git commit -S -m"test"
21:24:25.489158 git.c:418               trace: built-in: git commit -S -mtest
21:24:25.493338 run-command.c:643       trace: run_command: gpgsm --status-fd=2 -bsau myKey
error: gpg failed to sign the data
fatal: failed to write commit object

我找不到任何关于为什么git正在运行gpgsm命令的额外信息,因为单独运行该命令会产生以下结果:

gpgsm --status-fd=2 -bsau myKey
gpgsm: can't sign using 'myKey': No public key
[GNUPG:] INV_SGNR 1 myKey
[GNUPG:] INV_RECP 1 myKey

据我阅读,gpggpgsm的数据库是分开的,这似乎是有道理的。

git似乎也不想使用gpgsm密钥,因为它们需要CN和DNS条目。如果我的猜测错误,我很高兴被指出来,因为我不想使用符号链接hack。

环境详情:

  • 通过Homebrew安装的gpg,版本为2.2.11
  • no-tty添加到~/.gnupg/gpg.conf对我来说实际上使情况更糟了。
  • 更改后我已重新启动以确保gpg代理停止。
  • ~/.gnupg/gpg-agent.conf的内容为:pinentry-program /usr/local/bin/pinentry

你的目标是使用OpenPGP(默认的gpg二进制文件)还是CMS(gpgsm二进制文件)?另外,你正在使用哪个Git版本? - bk2204
我想使用“gpg”,因为这似乎是GitHub支持的,尽管我可能错误地认为它不支持“gpgsm”。我愿意使用任何可以让我避免符号链接(symlink)hack的方法。我的git版本是“2.20.0”。 - Richard Geniesse
如果您使用普通的 gpg 二进制文件(而不是符号链接黑客),您会得到什么输出?此外,如果您运行 touch /tmp/foo && gpg --status-fd=2 -bsa /tmp/foo 来签署一个空文件,您会得到什么输出? - bk2204
抱歉,这段内容格式不太好。输出:gpg gpg: 警告:未提供命令。正在尝试猜测您的意图... gpg: 输入您的消息...第二条指令:touch /tmp/foo && gpg --status-fd=2 -bsa /tmp/foo [GNUPG:] KEY_CONSIDERED FC660649664B0D5D12EE7B63B209F8077D754B33 0 [GNUPG:] KEY_CONSIDERED FC660649664B0D5D12EE7B63B209F8077D754B33 2 [GNUPG:] BEGIN_SIGNING H8 [GNUPG:] PINENTRY_LAUNCHED 2111 curses 1.1.0 /dev/ttys006 xterm- 256color - [GNUPG:] SIG_CREATED D 1 8 00 1545082985 FC660649664B0D5D12EE7B63B209F8077D754B33 - Richard Geniesse
2个回答

3

我在偶然间发现了这篇解释关于git的gpg.format配置问题,从中找到了问题所在。 显然,它支持"opengpg",这将运行gpg和"x509",这将运行gpgsm。 运行以下命令会导致git commit -S使用gpg而不是gpgsm

git config --global gpg.format openpgp

您可以通过查看完整配置来确认格式是否符合您的预期:

git config -l --show-origin | grep gpg.format

0

由于Git尝试使用gpgsm,很可能您有某种配置设置为使用gpgsm作为签署事物的程序。您可能想要运行git config -l --show-origin并查看是否有选项设置使Git使用gpgsm。您可以搜索gpg,因为所有选项都在该顶级部分下设置。


这也是我的想法,但我就是找不到它在哪里设置。运行提供的命令显示gpg作为我的程序,无论是全局还是在我的测试存储库中,而那个git调试命令继续尝试运行gpgsm。当运行git全局配置时,我也没有找到任何关于gpgsmgrep命中。非常奇怪。我将比较一下一些同事的设置。感谢您的帮助;这将是一些奇怪的东西,如果/当我找到它时,我会确保更新。 - Richard Geniesse

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