使用GPG签署Git提交

通过给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]

在这个输出中:

  1. sec 行
    • sec 表示这是你的 主要密钥(Primary Key),通常用于签名和认证,可以将其看做私钥,请不要与他人分享这个秘钥。
    • rsa4096 表示使用 RSA 4096 位算法。
    • 1E88D3314CA59A8E 是你的 短密钥 ID
    • 9EF70557285F391963168CE31E88D3314CA59A8E 是你的 长秘钥 ID / 指纹
    • [SC] 标记表示这个密钥用于签名(S)和认证(C)。
    • [expires: 2027-05-07] 表示密钥的过期日期。在这之后,你需要更新密钥
  2. 用户 ID(UID)行
    • uid 表示用户 ID,包含了你的用户名和电子邮件地址。
    • [ultimate] 表示这是你的主要用户 ID。
    • <[email protected]> 是你的电子邮件地址。
  3. 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 :#解密文件
暂无评论

发送评论 编辑评论


				
上一篇
下一篇