本文将重点讨论GPG密钥的生成以及其与Git&GitHub的集成,GPG命令行工具的安装不在本文的讨论范畴之内。
请注意,如果删除了先前有的GPG密钥,则凡使用了此签名的提交均会变灰,请自行斟酌!

@[toc]

写作本文的契机是因为一个月前我配置GPG密钥时读了GitHub的官方文章,结果简中部分不但语句不通,甚至翻译还很不全…虽然最后折腾好了(挺简单一事),但是考虑到日后可能自己也有参考的需要,而且看到了Spencer’s Blog上的这篇文章,便决定干脆写篇文章记录一下好了。

Step One. 生成一对密钥

在安装完GPG后,你可以使用命令gpg --version来检测GPG是否安装成功

Tip: GPG的存储根目录为输出内容中的Home目录。
Windows环境可能会出现签名失败的bug,建议提前先记一下这个目录。

我们使用下面的命令来为我们自己生成一对GPG密钥(公钥+私钥)
gpg --full-generate-key

注意,上面的代码需要GPG版本为2.1.17或更高。

  • 对于密钥种类,在此处输入1(为RSA and DSA
  • 对于密钥种类,GitHub要求的最短长度为4096bits,一般来讲选择这个即可(输入4096
  • 对于密钥有效时长,默认为永久有效,请根据实际情况选择
    • 选择了有效期后,GPG会让你确认密钥会在多久后过期,若无误,在此时输入y表确认
  • 输入用户信息时,请确保输入了GitHub帐户上绑定了的==经过验证的==电子邮件地址
    • “要将电子邮件地址保密,请使用GitHub提供的no-reply电子邮件地址。”
    • “建议使用GitHub账户的用户名”
    • comment一项为密钥的注释,非必需
  • 最后一步,输入一个安全且你记得住的密码,回车,稍等片刻,等待命令行打印相关信息
若打印出了密钥的有关信息,则说明此时密钥已经生成成功啦,恭喜🎉
gpg: revocation certificate stored as 'C:\\Users\\xxxxxx\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\997AAxxxxxB2E8FxxxxxC38A9xxxxx5B217xxxxx.rev'
public and secret key created and signed.

pub   rsa4096 2023-01-05 [SC] [expires: 2023-01-06]
      997AAxxxxxB2E8FxxxxxC38A9xxxxxx5B217xxxxx
uid                      YanDao0313 <xxxxxxxxxx@qq.com>
sub   rsa4096 2023-01-05 [E] [expires: 2023-01-06]

Step Two. 获取密钥信息

接下来,输入以下命令,它会让GPG列出我们当前拥有的全部GPG Key
gpg --list-secret-keys --keyid-format=long
效果如下:
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   3  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 3u
gpg: next trustdb check due at 2023-01-06
C:\Users\xxxxxx\AppData\Roaming\gnupg\pubring.kbx
------------------------------------------------
sec   rsa4096/9D34EF5B217774C7 2023-01-05 [SC] [expires: 2023-01-06]
      997AAxxxxxB2E8FxxxxxC38A9xxxxxx5B217xxxxx
uid                 [ultimate] YanDao0313 <xxxxxxxxxx@qq.com>
ssb   rsa4096/C4F16EA309D522FD 2023-01-05 [E] [expires: 2023-01-06]
在本例中,sec一行中的rsa4096/9D34EF5B217774C7即为GPG私钥,后半段的9D34EF5B217774C7为私钥ID

Step Three. 把密钥告诉Git

在终端中输入如下命令,记得将9D34EF5B217774C7替换为你自己的私钥ID
git config --global user.signingkey 9D34EF5B217774C7
可选地,你可以全局强制使用GPG对提交签名,只需下面一行代码:
git config --global commit.gpgsign true
注意:在执行此命令后,每一次提交都需要输入密码进行签名,输一次密码即进入sudo mode,接下来的几分钟提交时不用再输密码。
此时可以进行一次提交,看看签名生效了没,如果Git报错满天飞,那么可能是Git调用了与我们刚刚使用的不一致的GPG,可以输入以下的命令进行手动指定:
git config --global gpg.program /把目录替换成你的/114514/1919810/gpg
不要忘记替换成刚刚提到过的home目录哦(这逝homo目录罢(悲

Step Four. 把密钥告诉GitHub

接下来,在终端中输入下面这一行命令,将9D34EF5B217774C7替换为你刚刚得到的私钥ID
gpg --armor --export 9D34EF5B217774C7
若无误,它会打印出一串很长的GPG密钥,请复制以-----BEGIN PGP PUBLIC KEY BLOCK-----为开头并以-----END PGP PUBLIC KEY BLOCK-----为结尾的密钥内容,请先暂时保存(但是不要以明文留存)

注意,==包含==这两句哦~

将输出粘贴进入GitHub的Settings » SSH and GPG keys,选择New GPG key项,配置、验证并保存。之后,凡是正确签名了的commit都有一个漂亮的绿标Verified字样,可以拿去炫耀 即使账号被恶意使用也有证据来证明那不是你的行为了!

👨‍💻 本文到此结束,祝你不被冒充!

若无特殊说明,请勿转载我站原创文章。

作者: Yandao 发表日期:2023 年 1 月 4 日


理性发言,和谐讨论