通过给Commit提交签名验证,可以在本地对标记和提交进行签名。 这些标记或提交在 GitHub 上标示为已验证,便于其他人信任更改来自可信的来源。如果提交或标记具有可加密验证的 GPG、SSH、 或 S/MIME 签名,GitHub 会将提交或标记标示为“已验证”或“部分验证”。
下面使用Windows 11 进行相关的操作
安装Gpg4win
前往官网下载并安装Gpg4win。
在安装的时候请留心安装目录,因为gpg的目录在gpg4win安装目录的上一层的另一个目录中。
生成 GPG 密钥对
运行以下命令生成 GPG 密钥对
gpg --full-generate-key
在提示时,指定要生成的密钥类型(例如 RSA),密钥长度(例如 4096 位),有效期限(例如一星期)。输入你的用户 ID 信息,确保输入的电子邮件地址与 GitHub 帐户的经过验证的电子邮件地址一致,如果Github的邮箱你是私密的状态,请将Github给你的私密的邮箱地址填写到用户ID里,还可以设置密钥的密码。
配置Git签名
首先列出你拥有的 GPG 密钥,使用以下命令列出你拥有的 GPG 密钥的长形式 ID:
gpg --list-secret-keys --keyid-format=long
然后输出如下:
C:\Users\maisui>gpg --list-secret-keys --keyid-format=long
gpg: checking the trustdb
gpg: next trustdb check due at 2030-06-30
[keyboxd]
---------
sec rsa4096/1E88D3314CA59A8E 2024-05-06 [SC] [expires: 2027-05-07]
9EF70557285F391963168CE31E88D3314CA59A8E
uid [ultimate] jack <[email protected]>
ssb rsa4096/F11321972DB3D79A 2024-05-06 [E] [expires: 2027-05-07]
在这个输出中:
sec
行:sec
表示这是你的 主要密钥(Primary Key),通常用于签名和认证,可以将其看做私钥,请不要与他人分享这个秘钥。rsa4096
表示使用 RSA 4096 位算法。1E88D3314CA59A8E
是你的 短密钥 ID。9EF70557285F391963168CE31E88D3314CA59A8E
是你的 长秘钥 ID / 指纹[SC]
标记表示这个密钥用于签名(S)和认证(C)。[expires: 2027-05-07]
表示密钥的过期日期。在这之后,你需要更新密钥
- 用户 ID(UID)行:
uid
表示用户 ID,包含了你的用户名和电子邮件地址。[ultimate]
表示这是你的主要用户 ID。<[email protected]>
是你的电子邮件地址。
ssb
行:ssb
表示这是你的 子密钥(Subkey),用于加密或其他特定功能,可以将其看做公钥。rsa4096
表示使用 RSA 4096 位算法。F11321972DB3D79A
是子密钥的 短密钥 ID。[E]
标记表示这个子密钥用于加密。[expires: 2027-05-07]
表示公钥的过期日期。在这之后,你需要更新密钥
然后从列表中复制你想要使用的 GPG 短指纹密钥ID。
使用以下命令将生成的 GPG 密钥 ID 添加到 Git 配置中:
git config --global user.signingkey <主要密钥的短密钥ID>
将<主要密钥的短密钥ID>替换为你生成的GPG主要密钥的短密钥ID,这个例子中为:1E88D3314CA59A8E。
验证签名设置
如果你只想当前仓库签名
git config commit.gpgsign true
如果所有仓库签名
git config --global commit.gpgsign true
关闭签名
git config commit.gpgsign false
然后我们创建一个新仓库测试签名效果,然而会发现报错了,并没有将commit签名成功,报No secret key。
C:\Users\maisui\GPG>git commit -m "Modify"
gpg: skipped "1E88D3314CA59A8E": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object
出现这个问题是因为git默认使那个gpg程序并不是我们安装好的那个,所以我们还得配置成使用我们新安装的gpg。这里的安装目录就是我们Gpg4win的上一级,比如安装在:C:\Program Files (x86)\Gpg4win 的话,则gpg的安装目录一般在:C:\Program Files (x86)\GnuPG。
git config --global gpg.program "<GnuPG的安装目录>\bin\gpg.exe"
然后重新commit,你就发现签名成功了。
Github部署公钥
到这一步, 如果我们直接将提交推送到GitHub上,提交上将会出现一个Unverified的标签, 这是因为, 虽然我们给提交签名了, 但是, GitHub还是不知道这个签名到底来自于谁。接下来,我们就要告诉GitHub: 我们这个用户所对于的公钥是哪个。
查看公钥ID
gpg --list-keys
导出我们的公钥将最后面的换成自己的公钥ID
gpg --armor --export 9EF70557285F391963168CE31E88D3314CA59A8E
复制以-----BEGIN PGP PUBLIC KEY BLOCK-----
开头并以-----END PGP PUBLIC KEY BLOCK-----
结尾的 GPG 密钥。然后打开github --->settings ---> SSH and GPG Keys
在 GPG keys栏中添加一个新的GPG key 将内容复制进去,然后输入密码。
配置密码缓存的时间
如果配置了GPG密钥的密码,在创建commit的时候经常会弹出一个窗口让我们输GPG的密码,怎么让这个窗口尽量的不要那么频繁的弹出呢,可以在我们打开Kleopatra
主界面,并点击顶部的“设置
“菜单中的”配置Kleopatra
“,在弹出的窗口中点击左侧菜单中的GnuPG系统
,在右侧的窗口中点击Private Keys
选项卡,其中有一个选项是Expire cached PINs after N second
,它默认的数值是600秒,即十分钟,设为0则每次都需要输入密码,个人建议是在私人电脑上设置86400秒,即一天一输。至此所有的配置都OK了。
PGP常用命令
gpg --full-generate-key: #生成密钥对
gpg --list-secret-keys --keyid-format LONG: #查看私钥信息
gpg --list-keys:#查看公钥
gpg --delete-secret-key <key ID>: #删除私钥
gpg --delete-key <key ID>: #删除公钥
gpg --armor --export <email or key-id> > public_key.asc :#导出公钥
gpg --armor --export-secret-keys <email or key-id> > private_key.asc : #导出私钥
gpg -e -r <recipient email or key-id> <file name>: #加密文件
gpg -d <file name>.gpg :#解密文件