Git (verify-commit, log --show-signature, merge --verify-signatures) with gpg.format=sshGit
错误信息
error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification
也可能输出为
- fatal: either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured
`git log --show-signature` 会打印同样的一行,然后对该提交显示“No signature”,看起来像是提交没有签名——其实并非如此。
含义
该提交带有 SSH 签名(`gpg.format ssh`),Git 会用 `ssh-keygen -Y verify` 对照一个“允许的签名者”(allowed signers)文件来验证这类签名,该文件把身份(电子邮件地址)映射到受信任的公钥。由于没有配置这样的文件,Git 无法判断签名是否来自你信任的人,于是报告错误而不是给出结论。签名本身可能完全有效。在签名一端,“either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured”是对应的配置缺失。
原因
配置了 SSH 签名,却从未配置验证
常见SSH 提交签名的指南通常只讲到 `gpg.format ssh` 和 `user.signingkey` 为止。签名可以正常工作;但验证还需要 `gpg.ssh.allowedSignersFile`。
配置的文件不存在
偶见路径来自 dotfiles 仓库,但在这台机器上并不存在;或者在写入配置的地方,`~` 没有被展开。
在没有签名者文件的 CI 中验证
偶见运行 `git verify-commit` 的分支保护脚本或发布脚本,需要在作业中提供允许的签名者文件,而不能只放在开发者的机器上。
修复方法
- 1.
创建允许的签名者文件
每行依次为:一个或多个主体(principal)、可选的选项(例如 `namespaces="git"`),然后是公钥。Git 会将提交者的电子邮件地址与主体比对。
bash # One line per trusted signer: principal (email) + public key; namespaces restricts it to git echo "alice@example.com namespaces=\"git\" $(cut -d' ' -f1,2 ~/.ssh/id_ed25519.pub)" >> ~/.config/git/allowed_signers git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers git verify-commit HEAD - 2.
把团队的签名者列表放在仓库中
仓库中一个经过评审的文件,能让所有人(以及 CI)验证同一组密钥;对它的修改要经过代码评审。
bash # Team setup: a reviewed allowed_signers file in the repository git config gpg.ssh.allowedSignersFile .github/allowed_signers git log --show-signature -1