其 key-id 在签名中的密钥没有签署此提交

The key whose key-id is in the signature did not sign this commit

我正在尝试签署我的 git 提交,但是当我将它们推送到 GitHub 时,它们有 Unverified 徽章和

The key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you. GPG key ID: mykeyid

我觉得这很神秘,在我的世界中,用于签署提交的 ID 将出现在签名中,因为具有该 ID 的密钥签署了提交!

Question How is this possible, and how do I solve it?

我特别希望能够从我的 IDE 中自动签署提交,而无需每次都输入我的密码。


如果有兴趣,这里是我所做的相关步骤的总结。前几个与 GitHub 的签名提交指南一致。

  1. 生成密钥对,将--armor --export给的GPG密钥添加到GitHub账户
  2. 更新 git 配置 user.signingkey
  3. 将提交设置为默认使用 git config --global commit.gpgsign true 签名。
  4. git自带的gpg版本太旧,我安装了gpg 2,用gpg --version检查过,我更新了GNUPGHOME以防万一
  5. 制作了一个脚本C:\Users\username\gpg-no-tty.sh并放入其中echo mypassphrase | gpg --passphrase-fd 0 --batch --no-tty --yes "$@"。找不到比明文密码更好的东西了。
  6. 使用 git config --global gpg.program C:\Users\username\gpg-no-tty.sh 将 git 指向此脚本。

验证

  1. 重要提示:我已验证 git verify-commit HEAD 显示与我的 git 配置中的 signingkey 相同的 ID,这与我在设置中显示的 GitHub GPG 密钥相同. (还会输出警告gpg: WARNING: unsafe permissions on homedir
  2. 同样重要的是,正如 Ferrybig 在评论中提到的,我检查了我在 git 配置中的电子邮件是否与我的 gpg 密钥所用的电子邮件相同,是否与 [=] 中用作主要(已验证)电子邮件的电子邮件相同99=].
  3. 正如 Jens Erat 在评论中提到的,您还可以使用指纹(40 个字符串)代替 gpg --list-secret-keys --keyid-format LONG 输出的长 ID(16 个字符),我在 [=94] 中尝试过=]config 但它没有帮助。

gpg-agent

正如 Daniel H 在评论中所建议的那样,有类似 gpg-agent 的东西应该记住你的密码,这就是我试过的:

  1. use-agentno-tty(与我的 IDE 不期望控制台界面要求密码有关)添加到 C:\Users\username\.gnupg\gpg.conf,更改 gpg.program 在我的 .gitconfiggpg
  2. 加上C:/Users/username/.gnupg/gpg-agent.conf的生存时间:default-cache-ttl 34560000max-cache-ttl 34560000
  3. 我得到gpg: gpg-agent is not available in this session,但还没有找到解决方法。 gpg-agentgpg 都是 2.2.1 版本,所以这不是问题。
  4. 根据一些消息来源,对于 gpg 版本 > 2.1,环境变量 GPG_AGENT_INFO 需要指向 C:\Users\username\.gnupg\S.gpg-agent。我这样做并重新启动。现在我得到 gpg: gpg-agent protocol version 0 is not supported.
  5. 我将 :1 添加到该路径,现在我得到 gpg: can't connect to 'C': invalid value。这对我来说没有任何意义。什么是 C,它来自哪里?是我的驱动器号,所以 gpg 尝试将路径作为对象执行?

您可以在创建密钥时不设置密码,也可以尝试使用 gpg-agent。对我来说它没有用,我仍然必须提供密码,但值得一试:

将 git 至少更新到 2.19.1,因为它现在包含 gpg2,请确保您使用 git 的 gpg 并尝试再次使用 gpg-agent - 它现在应该可以工作了。您的 'gpg-agent' 步中只有第 2 步就足够了。

如果您 运行 遇到迁移问题,您可能需要删除包含密钥的 ~\.gnupg 目录(注意错误消息可能具有误导性),因此您可以使用以下命令重新生成所有内容(包括密钥) git 的 gpg。

我已经在中写下了完整的说明。