跳到主要内容
ecdsa.com
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”是对应的配置缺失。

原因

修复方法

  1. 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. 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

相关错误

浏览完整的签名错误库