让Git Commit安全可信的第一步:GPG签名

如果你有相关的问题/意见,欢迎留言。
但我不常看论坛,你也可以选择给我发邮件就是了:learnku@sunxyw.xyz

在上一篇文章《GPG 密钥创建及管理(+替代SSH使用)》中,我们创建了一个用于签发子密钥的主密码,以及用于日常使用的子密钥,并成功将其作为 SSH 密钥使用。在本篇文章中,将会带领大家将 GPG 子密钥用于 Git 提交签名,从而让你的提交更加高大上安全可信。

为什么要签名提交?

使用 GPG 密钥进行 Git 提交签名的主要作用是证明提交来自于你本人。
在传统 Git 提交中,用户可以选择以任何人的名义提交代码,例如使用 --author="sunxyw <git@sunxyw.xyz>"便可以将提交作者伪装成我。当然它本身并非一个安全漏洞,但不可否认的是它可以用来隐藏真正的作者,尤其是隐藏恶意代码的提交者。如果一个提交并未被签名,你是没有办法确认提交者是否是真正的作者,也没法保证代码没有被篡改。
而进行提交签名则可以解决以上的问题。需要注意的是,使用签名并不会让其他人无法伪装成你来提交。但是由你签名的提交是无法被伪造的,尤其在 GitHub 启用强制签名模式时,没有正确签名的提交会被识别为未验证(Unverified)提交,可以方便其他人辨别不属于你的提交。
简单来说,签名提交可以证明你是真正的作者,确保代码没有被篡改,并可用作可靠的代码审计/追踪证据。
圖片.png圖片.png

创建专用于 Git 提交签名的子密钥

  1. 进入 GPG 控制台

    $ gpg --edit-key <你的名字>
  2. 创建子密钥

    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

  3. (可选)如果你用于 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
  4. 保存并退出

    gpg> save
  5. 导出 GPG 公钥

    $ gpg --armor --export <这里填第二步记下的ID>

    你应该会拿到很长一段文字,那就是你的公钥,请保留以待后续使用。

配置 Git 使用签名

  1. 全局启用签名

    $ git config --global commit.gpgsign true
  2. 配置用于签名的密钥

    $ git config --global user.signingkey <你的密钥ID>

上传公钥至 GitHub

github.com/settings/gpg/new
Title填你喜欢的,Key就是你上边复制的公钥,整段粘贴进去就可。
添加完成后,可以顺便把下边的 Vigilant mode勾选。

最后随便整个提交测试下吧

如果你不幸遇到了问题

  1. 执行 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 协议》,转载必须注明作者和本文链接
sunxyw
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!