Git提交签名内部机制及user.signingkey配置疑问解答
问题背景
我了解基础加密、SSH密钥和证书相关知识。在配置Git提交签名时,执行了命令:
$ git config --global user.signingkey /PATH/TO/.SSH/KEY.PUB
这里产生了困惑:公钥是公开的,按加密逻辑应该用本地私钥签名,平台用已存储的公钥验证,为什么要配置公钥路径?
实际流程说明
我的推测是正确的:实际仍是用私钥完成签名,配置公钥的作用是让Git找到ssh-agent中加载的对应私钥,由ssh-agent调用私钥执行签名操作。
Git官方文档对此的说明(翻译后):
如果
git-tag或git-commit在创建签名标签或提交时未自动选中你需要的密钥,可通过此变量覆盖默认选择。该选项会直接传递给gpg的--local-user参数,因此你可以使用gpg支持的任何方式指定密钥。**若gpg.format设置为ssh,当使用ssh-agent时,此选项可包含私钥或公钥的路径。也可直接传入前缀为key::的公钥(例如:"key::ssh-rsa XXXXXX identifier")。私钥需可通过ssh-agent访问。**若未设置此选项,Git会调用gpg.ssh.defaultKeyCommand(例如:"ssh-add -L")并尝试使用第一个可用的密钥。为保持向后兼容性,以"ssh-"开头的原始密钥(如"ssh-rsa XXXXXX identifier")会被视为"key::ssh-rsa XXXXXX identifier",但此形式已被弃用,建议使用key::形式。
简单来说,配置公钥路径是为了告诉Git:要使用ssh-agent中与该公钥配对的私钥来签名。这种方式更安全,因为Git不需要直接访问私钥文件,只需要通过公钥匹配到ssh-agent中已加载的私钥实例即可。
内容的提问来源于stack exchange,提问作者VIAGC

