为什么设置 git commit签名是公钥而不是私钥?
下面是Github的文档,为什么设置 SSH 签名密钥是公钥而不是私钥?
将 SSH 密钥告知 Git
可以使用现有 SSH 密钥对提交和标记进行签名,或生成专用于签名的新密钥。 有关详细信息,请参阅“生成新的
SSH 密钥并将其添加到 ssh-agent”。注意!!SSH 签名验证可用于 Git 2.34 或更高版本。 若要更新 Git 版本,请参阅 Git 网站。
打开终端。
配置 Git 使用 SSH 对提交和标记签名:
git config --global gpg.format ssh若要在 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 在验证签名时可以:
- 从 Git 提交中读取签名信息和声明使用的公钥指纹。
- 用你上传到 GitHub 的公钥比对这个指纹。
- 如果匹配上了,就认定这个提交是你签的。
🔐 私钥在哪里?
私钥从不应该出现在 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」里。