让Git Commit安全可信的第一步:GPG签名
如果你有相关的问题/意见,欢迎留言。
但我不常看论坛,你也可以选择给我发邮件就是了:learnku@sunxyw.xyz
在上一篇文章《GPG 密钥创建及管理(+替代SSH使用)》中,我们创建了一个用于签发子密钥的主密码,以及用于日常使用的子密钥,并成功将其作为 SSH 密钥使用。在本篇文章中,将会带领大家将 GPG 子密钥用于 Git 提交签名,从而让你的提交更加高大上安全可信。
为什么要签名提交?
使用 GPG 密钥进行 Git 提交签名的主要作用是证明提交来自于你本人。
在传统 Git 提交中,用户可以选择以任何人的名义提交代码,例如使用 --author="sunxyw <git@sunxyw.xyz>"
便可以将提交作者伪装成我。当然它本身并非一个安全漏洞,但不可否认的是它可以用来隐藏真正的作者,尤其是隐藏恶意代码的提交者。如果一个提交并未被签名,你是没有办法确认提交者是否是真正的作者,也没法保证代码没有被篡改。
而进行提交签名则可以解决以上的问题。需要注意的是,使用签名并不会让其他人无法伪装成你来提交。但是由你签名的提交是无法被伪造的,尤其在 GitHub 启用强制签名模式时,没有正确签名的提交会被识别为未验证(Unverified)提交,可以方便其他人辨别不属于你的提交。
简单来说,签名提交可以证明你是真正的作者,确保代码没有被篡改,并可用作可靠的代码审计/追踪证据。
创建专用于 Git 提交签名的子密钥
进入 GPG 控制台
$ gpg --edit-key <你的名字>
创建子密钥
gpg> addkey
流程跟之前创建子密钥没有区别,不确定的可以参照上一篇文章,这里简单说下选项:密钥类型选
(8) RSA (set your own capabilities)
/ 可用操作保留Sign Encrypt
/ 密钥长度随意 / 有效期随你喜欢 / 确认 / 确认。
创建完成后,应该会展示所有密钥的信息和ID,请记下 ID,后续会用到。
例如:sec rsa4096/11DC61840BEB9ECD created: 2022-08-14 expires: 2023-08-14 usage: C trust: ultimate validity: ultimate ssb rsa4096/1342FE9D193CEF1B created: 2022-08-14 expires: 2023-08-14 usage: SEA ssb rsa3072/F391C42B19AFFC98 created: 2022-08-21 expires: 2023-08-21 usage: SE
记下
usage: SE
的那个 ID,也就是F391C42B19AFFC98
(可选)如果你用于 Git 提交的邮箱并非你一开始创建主密码用的那个(也就是上一步最后显示的那个),那可以将你用于提交的邮箱也添加进去
gpg> adduid Real name: <你的名字> Email address: <你的邮箱> Comment: <注释,比如我写的是Git Committer> You selected this USER-ID: "<你的名字> (<注释>) <<邮箱>>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
保存并退出
gpg> save
导出 GPG 公钥
$ gpg --armor --export <这里填第二步记下的ID>
你应该会拿到很长一段文字,那就是你的公钥,请保留以待后续使用。
配置 Git 使用签名
全局启用签名
$ git config --global commit.gpgsign true
配置用于签名的密钥
$ git config --global user.signingkey <你的密钥ID>
上传公钥至 GitHub
去 github.com/settings/gpg/new。Title
填你喜欢的,Key
就是你上边复制的公钥,整段粘贴进去就可。
添加完成后,可以顺便把下边的 Vigilant mode
勾选。
最后随便整个提交测试下吧
如果你不幸遇到了问题
- 执行
git commit
报错:
可以尝试在命令前方加上error: gpg failed to sign the data fatal: failed to write commit object
GIT_TRACE=1
再执行看看,比如:GIT_TRACE=1 git commit -m "add more test cases"
。
然后可以试着执行报错的命令,并参照具体报错内容解决。
实在不行的,也可以回帖提问,尽量回答。
本作品采用《CC 协议》,转载必须注明作者和本文链接