Mac端Git GPG提交签名提示Bad Signature问题求助
Mac环境Git GPG提交报Bad Signature排查方案
问题特征:同密钥手动签名普通文件正常,仅Git提交签名校验失败,历史存在1次成功签名记录,日志显示两次签名使用的EDDSA子密钥ID完全一致。
按优先级排查解决
第一步:核对Git调用的GPG程序路径,这是Mac平台最高发的诱因
很多用户会同时安装Homebrew版gnupg、GPG Suite等多个GPG环境,不同环境的密钥存储路径不互通,一旦Git调用的GPG程序和你终端手动签名用的不是同一个,就会出现手动签名正常、Git签名无效的问题。- 终端执行
which gpg,记下当前终端默认调用的gpg绝对路径,M系列Mac默认brew安装路径为/opt/homebrew/bin/gpg,Intel Mac为/usr/local/bin/gpg - 执行
git config --global --get gpg.program查看Git配置的GPG路径,如果输出为空、和上一步查到的路径不一致,直接执行命令修正(路径替换成你自己which gpg查到的结果):# M系列Mac示例 git config --global gpg.program /opt/homebrew/bin/gpg - 如果你本地同时装了GPG Suite和brew版gnupg,建议统一只用一个,避免两个程序的密钥环不同步。
- 终端执行
第二步:核对签名密钥配置,排除仓库级配置覆盖
- 执行
gpg --list-secret-keys --keyid-format=long,确认你要用的EDDSA签名子密钥(日志中ID为C84C8DAA9C25D70F553262EE4584796C0B3C2855)私钥存在、未过期、未吊销 - 分别查看全局和当前仓库的签名密钥配置,避免仓库级配置覆盖全局正确配置:
# 查全局配置 git config --global --get user.signingkey # 查当前仓库本地配置 git config --local --get user.signingkey - 如果配置值和你实际要用的子密钥ID不匹配,直接修正即可,EDDSA密钥建议直接配置签名子密钥ID,不要用主密钥ID,避免版本兼容问题:
git config --global user.signingkey 4584796C0B3C2855
- 执行
第三步:修复GPG终端环境配置
Mac下如果没配置GPG_TTY环境变量,会导致密码输入后gpg-agent传输出错,生成无效签名:- 把下面两行配置加到你用的shell配置文件中,zsh用户改
~/.zshrc,bash用户改~/.bash_profile:export GPG_TTY=$(tty) gpgconf --launch gpg-agent - 执行
source ~/.zshrc(对应你自己的配置文件路径)让配置生效,再执行killall gpg-agent杀掉旧的代理进程,重新测试提交。
- 把下面两行配置加到你用的shell配置文件中,zsh用户改
第四步:排查GUI客户端环境问题
如果你平时用VS Code、SourceTree、Fork等GUI客户端提交代码,先切到终端手动执行签名提交测试:# 随便改个文件后执行 git add . git commit -S -m "test gpg sign" git log --show-signature -1如果终端提交签名正常,只有GUI提交报Bad Signature,说明GUI客户端没有继承正确的shell环境变量,直接在GUI客户端的Git配置项里手动指定
gpg.program为之前查到的gpg绝对路径即可。第五步:兜底检查项
- 核对Git配置的提交邮箱:执行
git config --global user.email和git config --local user.email,确认邮箱和GPG密钥绑定的邮箱完全一致,无多余空格、大小写错误 - 检查签名格式配置:执行
git config --global --get gpg.format,如果输出为ssh,说明误开了SSH签名模式,执行git config --global gpg.format openpgp改回GPG签名模式即可 - 日志中出现的“无可信签名”警告是因为密钥未设置所有者信任度,不影响签名有效性,不需要额外处理。
- 核对Git配置的提交邮箱:执行
问题参考日志
commit 2cce84252649442b2b1700986f969fd70d8d7dbc (HEAD -> move-to-docker) gpg: Signatur vom Di 14 Jun 07:30:19 2022 CEST gpg: mittels EDDSA-Schlüssel C84C8DAA9C25D70F553262EE4584796C0B3C2855 gpg: FALSCHE Signatur von "Nick Wassermann (Root SSH User) <nick.wassermann@mail.at>" [unbekannt] Author: Nick Wassermann <nick.wassermann@mail.at> Date: Tue Jun 14 07:30:19 2022 +0200 tte commit 3ad84f737e7d1f42907cb55b11482c7d5558adaf gpg: Signatur vom Mo 13 Jun 09:23:06 2022 CEST gpg: mittels EDDSA-Schlüssel C84C8DAA9C25D70F553262EE4584796C0B3C2855 gpg: Korrekte Signatur von "Nick Wassermann (Root SSH User) <nick.wassermann@mail.at>" [unbekannt] gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur! gpg: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört. Haupt-Fingerabdruck = 90C6 F702 31A1 7582 98B3 C94C 1779 A12E 703B D538 Unter-Fingerabdruck = C84C 8DAA 9C25 D70F 5532 62EE 4584 796C 0B3C 2855 Author: Nick Wassermann <nick.wassermann@mail.at> Date: Mon Jun 13 09:23:06 2022 +0200 added comment
内容的提问来源于stack exchange,提问作者Nick Wassermann
相关产品推荐
相关产品推荐

