为什么设置 git commit签名是公钥而不是私钥?

下面是Github的文档,为什么设置 SSH 签名密钥是公钥而不是私钥?

将 SSH 密钥告知 Git
可以使用现有 SSH 密钥对提交和标记进行签名,或生成专用于签名的新密钥。 有关详细信息,请参阅“生成新的
SSH 密钥并将其添加到 ssh-agent”。

注意!!SSH 签名验证可用于 Git 2.34 或更高版本。 若要更新 Git 版本,请参阅 Git 网站。

  1. 打开终端。

  2. 配置 Git 使用 SSH 对提交和标记签名:
    git config --global gpg.format ssh

  3. 若要在 Git 中设置 SSH 签名密钥,请粘贴下面的文本,将
    /PATH/TO/.SSH/KEY.PUB 替换为要使用的公钥路径:
    git config --global user.signingkey /PATH/TO/.SSH/KEY.PUB

你提到的 GitHub 文档中,确实是让你设置公钥路径作为 Git 的 user.signingkey,很多人会疑惑:不是应该使用私钥签名吗?为什么要设置公钥?

这个问题的关键在于 你设置的是 “用于标识签名者的身份”,而真正用来做签名的仍然是私钥,只是它不需要你手动设置


✅ 为什么设置公钥而不是私钥?

  • 签名操作用的是私钥,这个私钥应该已经被你放在 ~/.ssh 中,并且由 ssh-agent 管理。

  • Git 配置中设置的是 “用于识别你的公钥”,也就是告诉 Git:

    “这个是我用来签名的私钥对应的公钥,请用这个公钥计算指纹,写入到签名信息中。”

这样,GitHub 在验证签名时可以:

  1. 从 Git 提交中读取签名信息和声明使用的公钥指纹。
  2. 用你上传到 GitHub 的公钥比对这个指纹。
  3. 如果匹配上了,就认定这个提交是你签的。

私钥在哪里?

私钥从不应该出现在 Git 配置中,出于安全原因。正确的做法是:

  • 私钥保存在本地 ~/.ssh/id_ed25519(或你自定义生成的)。
  • 它被 ssh-agent 加载(你可以用 ssh-add 加入)。
  • Git 会自动调用 ssh-agent 中的私钥来做签名。

⚙️ 总结

项目 内容
签名用的是 私钥(由 ssh-agent 管理)
Git 配置的是 公钥路径(用于识别签名用的密钥)
GitHub 验证方式 从你设置的 signingkey 获取指纹,匹配 GitHub 上传的公钥
为什么不用私钥 因为私钥必须保密,不应写入配置或上传

如果你还没生成或配置 SSH 密钥用于签名,可以参考这一步(生成只用于签名的新密钥):

ssh-keygen -t ed25519 -C "signing key" -f ~/.ssh/id_ed25519_signing
ssh-add ~/.ssh/id_ed25519_signing

然后设置签名:

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519_signing.pub

你还需要把公钥 .pub 添加到 GitHub 的「SSH and GPG keys → SSH Signing Keys」里。

你可能感兴趣的:(Git,git)