macOS GPG 使用指南

这篇指南面向的是对 GPG 有了一定了解的的朋友,如果你还不知道 GPG 是什么,那么可能需要先补充一下这部分的基础知识,再来食用比较合适。

如果你已经大概了解 GPG 的一些内容,知道它能用来干什么而且你真的需要用到。那么这篇指南或许对你有一点的帮助。

这篇指南主要针对于 macOS 系统下的 GPG 使用方法,如果你使用的是 Windows 或者 Linux,其中有些内容可能并不适用。

文中使用的 GPG 版本是 2.4.5 版本信息如下。

备注: 下文中所有的展示内容的部分 $ 开头的行表示的当前 shell 环境的命令输入行。命令均不包含 $ 本身。

$ gpg --version
gpg (GnuPG) 2.4.5
libgcrypt 1.10.3
Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/zebedy/.gnupg
支持的算法:
公钥: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
密文: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
散列: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩: 不压缩, ZIP, ZLIB, BZIP2

初次使用

如果你还没有任何密钥,想新生成一个使用。建议从这里开始。

生成主密钥

一般的情况下,我们使用 --gen-key 就可以快速的生成一个密钥对,但是这个是一个简便方法。

这里我们需要更多的细节设置,所以用 --full-gen-key 来代替

$ gpg --full-gen-key
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥类型:
(1) RSA 和 RSA
(2) DSA 和 Elgamal
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(9) ECC(签名和加密) *默认*
(10) ECC(仅用于签名)
(14)卡中现有密钥
您的选择是? 9

在该版本(2.4.5)下可以通过 *默认* 可以看默认的密钥类型为 ECC(签名和加密) 这里我们不需要任何修改。使用默认即可。

在当前界面输入选项前面括号中的数字 9 之后回车确认,或者不输入任何内容直接回车确认即可。

请选择您想要使用的椭圆曲线:
(1) Curve 25519 *默认*
(4) NIST P-384
(6) Brainpool P-256
您的选择是? 1

类似上一步,选择使用的椭圆曲线,这里选择默认 Curve 25519 即可。

在当前界面输入 1 之后回车确认,或者不输入任何内容直接回车确认即可。

请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0

然后这里需要选择密钥的有效期。

如果是个人使用,可以选择永不过期,这样可以避免以后过期后还需要再次创建一个新的密钥。

而如果需要配置特定的过期时间。则根据下面的三个选项输入对应的内容即可,比如需要在一周后过期,则输入 1w 3 个月后过期 3m

我这里就选了 0 表示永不过期。输入数字 0 回车后经过二次确认。

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名:

从这里开始后面的步骤就是输入密钥对应的个人信息了。

依次输入内容包括 真实姓名, 电子邮件地址, 注释 其中注释可以省略。

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: zebedy
电子邮件地址: zebedy@example.com
注释:
您选定了此用户标识:
“zebedy <zebedy@example.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?

这里如果确认个人信息输入没问题,就可以输入字母 O 回车确认。

确定之后根据提示设置主密钥的密码。确定密码后。经过短暂的时间就可以生成一个密钥了。

这个密码一定要妥善保管,会经常需要使用。

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 吊销证书已被存储为‘/Users/zebedy/.gnupg/openpgp-revocs.d/A31F6E522B93990CA1A1C548D188A1DD832AB894.rev’
公钥和私钥已经生成并被签名。

pub ed25519 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid zebedy <zebedy@example.com>
sub cv25519 2024-03-24 [E]

到这里,主密钥就生成结束了。

生成子密钥

替换默认 pinentry

在生成子密钥之前,首先需要做一个事情:替换默认的 pinentry

pinentry 是用来合用乎交互输入密码的,因为默认的 pinentry 依赖 GPG_TTY 所以可以再终端中实现输入密码。但是如果我们在其他的地方,比如 VSCode 或者 JB 全家桶的时候,就会出现因为无法输入密码导致失败。

所以我们需要安装第三方的 pinentry-mac,并替换默认 pinentry

$ brew install pinentry-mac
$ echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf

然后重启 gpg-agent 即可

$ echo RELOADAGENT | gpg-connect-agent

创建用于 SSH 鉴权的子密钥

创建子密钥

首先我们查看一下主密钥的相关信息

$ gpg --list-keys --keyid-format=long
gpg: 正在检查信任度数据库
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: 深度:0 有效性: 4 已签名: 0 信任度:0-,0q,0n,0m,0f,4u
[keyboxd]
---------
pub ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid [ 绝对 ] zebedy <zebedy@example.com>
sub cv25519/2978529F4782B600 2024-03-24 [E]

  • 第一行 开头的 pub 表示这个是公钥, ed25519 是上面创建密钥时选择的椭圆曲线方法, 后面的 D188A1DD832AB894 是公钥的16位短摘要, 2024-03-24 是生成时间, [SC]S:signing 表示可以用于签名 C:certification 表示可以用于认证。
  • 第二行 A31F6E522B93990CA1A1C548D188A1DD832AB894 是密钥的40位长摘要。其中上面的短摘要就是长摘要的后16位。
  • 第三行 uid 是用户信息,[ 绝对 ] 表示该密钥的信任等级是最高级别: 绝对信任。后面分别是输入的名字,注释和电子邮件
  • 第四行 sub 表示这个是子公钥,是创建主密钥的时候自动生成的一个子密钥,最后的[E]E:encryption 表示可用于加密

当然我们也可以通过 --list-secret-keys 查看私钥

$ gpg --list-secret-keys --keyid-format=long
[keyboxd]
---------
[keyboxd]
---------
sec ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid [ 绝对 ] zebedy <zebedy@example.com>
ssb cv25519/2978529F4782B600 2024-03-24 [E]

内容和上面只有前面的 pub -> sec(表示私钥),sub -> ssb(表示子私钥) 不一样,其他的内容都一样。

通过上面知道主密钥的摘要是 D188A1DD832AB894 (这里用长短摘要都可以。但是为了方便,后面就都用短摘要。也可以直接使用 uid 中的姓名)

接下来就需要用这个主密钥生成一个子密钥。因为需要用到高级自定义,所以需要加上 --expert

$ gpg --expert --edit-key D188A1DD832AB894 # 或者是 gpg --expert --edit-key zebedy
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

sec ed25519/D188A1DD832AB894
创建于:2024-03-24 有效至:永不 可用于:SC
信任度:绝对 有效性:绝对
ssb cv25519/2978529F4782B600
创建于:2024-03-24 有效至:永不 可用于:E
[ 绝对 ] (1). zebedy <zebedy@example.com>

gpg>

可以看到这里 shell 变成了 gpg> 表示进入了与 GPG 的交互

输入 addkey 添加一个新的子密钥

gpg> addkey
请选择您要使用的密钥类型:
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(5) ElGamal(仅用于加密)
(6) RSA(仅用于加密)
(7) DSA(自定义用途)
(8) RSA(自定义用途)
(10) ECC(仅用于签名)
(11) ECC(自定义用途)
(12) ECC(仅用于加密)
(13) 现有密钥
(14)卡中现有密钥
您的选择是? 8

输入 8 回车确认,使用 RSA(自定义用途) 选项手动配置这个密钥。

RSA 密钥的可实现的功能: 签名(Sign) 加密(Encrypt) 身份验证(Authenticate)
目前启用的功能: 签名(Sign) 加密(Encrypt)

(S) 签名功能开关
(E) 加密功能开关
(A) 身份验证功能开关
(Q) 已完成

您的选择是? S

这里可以看到这个子密钥目前启用的功能有 签名(Sign)加密(Encrypt)

但是 SSH 鉴权不需要这两个功能,所以我们先要取消这两个功能。

输入 S 回车后取消 签名(Sign) 的功能

RSA 密钥的可实现的功能: 签名(Sign) 加密(Encrypt) 身份验证(Authenticate)
目前启用的功能: 加密(Encrypt)

(S) 签名功能开关
(E) 加密功能开关
(A) 身份验证功能开关
(Q) 已完成

您的选择是? E

现在子密钥目前启用的功能就只有 加密(Encrypt) 了,再次输入 E 回车。

RSA 密钥的可实现的功能: 签名(Sign) 加密(Encrypt) 身份验证(Authenticate)
目前启用的功能:

(S) 签名功能开关
(E) 加密功能开关
(A) 身份验证功能开关
(Q) 已完成

您的选择是? A

现在已启用功能就没有了任何内容,输入 A 回车后开启 SSH 鉴权需要的功能。

RSA 密钥的可实现的功能: 签名(Sign) 加密(Encrypt) 身份验证(Authenticate)
目前启用的功能: 身份验证(Authenticate)

(S) 签名功能开关
(E) 加密功能开关
(A) 身份验证功能开关
(Q) 已完成

您的选择是? Q

然后输入 Q 结束自定义功能,进入 RSA 密钥选项。

因为添加子密钥的时候选择的是 RSA 密钥,所以这里需要指定密钥长度。长度越长,安全性越高。我这里就选择 4096

RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 4096

然后设置子密钥的有效期。因为也是个人长期使用,所以选择 0 密钥永不过期

请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0

然后经过两次输入 y 的确认后,会提示输入主密钥的密码。因为创建子密钥需要用到主密钥的私钥,所以需要用到主密钥的密码。

输入完正确密码后,经过短暂时间就生成了一个 RSA 密钥。

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec ed25519/D188A1DD832AB894
创建于:2024-03-24 有效至:永不 可用于:SC
信任度:绝对 有效性:绝对
ssb cv25519/2978529F4782B600
创建于:2024-03-24 有效至:永不 可用于:E
ssb rsa4096/EFA3B0684ECE9D91
创建于:2024-03-24 有效至:永不 可用于:AR
[ 绝对 ] (1). zebedy <zebedy@example.com>

gpg>

和上面相比可以看到已经多了一个摘要为 EFA3B0684ECE9D91 的子密钥。

还有最后一步,输入 save 回车保存就退出 GPG 的交互 shell 了。

至此,子密钥创建完成。

回到查看密钥信息那里。我们再通过 --list-keys 查看当前密钥信息就可以看到这个子密钥了。

$ gpg --list-keys --keyid-format=long
[keyboxd]
---------
pub ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid [ 绝对 ] zebedy <zebedy@example.com>
sub cv25519/2978529F4782B600 2024-03-24 [E]
sub rsa4096/EFA3B0684ECE9D91 2024-03-24 [AR]

相比上面可以看到到了一个 EFA3B0684ECE9D91 的子密钥

配置 SSH

启用 GPG Agent 的 SSH 支持
$ vim ~/.gnupg/gpg-agent.conf # 文件可能不存在,如不存在则创建

在文件中单独一行添加 enable-ssh-support

设置 GPG Agent 替代 SSH Agent

修改对应 shell 的配置文件 (我使用的是 zsh,自己根据使用的 shell 调整)

vim ~/.zshrc

添加以下内容到合适的地方

export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
添加子密钥 keygrip

首先通过 --with-keygrip 获取子密钥的 keygrip

$ gpg --list-keys --with-keygrip --keyid-format=long
[keyboxd]
---------
pub ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
Keygrip = F95E3D5B168563C4F65853E8C0396815CE819A21
uid [ 绝对 ] zebedy <zebedy@example.com>
sub cv25519/2978529F4782B600 2024-03-24 [E]
Keygrip = C5F82430DCB7B754782189638CBC8778D3E84AB8
sub rsa4096/EFA3B0684ECE9D91 2024-03-24 [AR]
Keygrip = 9C0935998C1D9F9BDE3030BB1C1A10A4454E56F8

找到上一步创建的子密钥 EFA3B0684ECE9D91 他的 Keygrip = 9C0935998C1D9F9BDE3030BB1C1A10A4454E56F8

编辑 ~/.gnupg/sshcontrol 文件

vim ~/.gnupg/sshcontrol

将这个 9C0935998C1D9F9BDE3030BB1C1A10A4454E56F8 添加到单独一行,保存。

然后重启终端

检查 SSH Key 是否存在

$ ssh-add -l
4096 SHA256:GvaU9MfvKVMa9FVM+KN28z+MDCML6429dWeILycSPPw (none) (RSA)

看到类似内容就表示添加成功

导出 SSH 公钥
$ gpg --export-ssh-key EFA3B0684ECE9D91 # 或者是 gpg --export-ssh-key zebedy
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6guDA+iEFZe2op48auILxCkN6IRWJstpp1X/iNtohEcUpBxJ3g0qMKiMQnFHOTsL0PCci2Ifmg740DE5RWC+QPhAiJCl/VT6nUK4wT+wx+0CoseQEg9RLWnq6+WYXi2GLEKZLIdxvpcrsm6IaEIUk8Z8CMbuJocFrOeAGsV9F9QsRIFyqGNw8v6/+rBDDZdfGbKrp54heNM61YtvVDtSSCgMq0iFW8mlxR1F3egaiffJid/LWWlDht15ndB8C+5ZIpK/Tbr6bHy9VWnbXOmxP4MBL4SyTUkEgvAqMEG5PWiS6PsfUbkvWTNRx6TG5RsZ7Xu0AVcB6//ZEHkjZeIeW9glMf7tC3H8bhpadDcDusPCeJv04TuAkFjYZVUSCnvR1qVUxe6VR9rhE6tBi86YGngvIRcWHjVe7o1CiQLSFAp9T5vD1HjRo8Q6pnKP4sq66jXH61MrhLMhLQt3RVryWe2AlPYtcYPlWRrl4uj3o8TKNQDhBFO7tMssHo474eC50epzpdOoC4etzHcIIVmMKSnvSl1Z46LUgkmcgL4Wj0NTqBWx58KFKjpYAT5dcZisvUsGM6pbFgFJRLRUcjibiR3vm3H34p08vaLYW5ldOJKwTf59rGiRI/ileY+1xpBsbc48PBAyX13433Lgw9TnRvjd+Ovkma7PU/QoJPKm+Sw== openpgp:0x4ECE9D91

然后就可以把这个它添加到任何需要使用 SSH 的地方,比如 GitHub 或者自己服务器上的 ~/.ssh/authorized_keys 中。

至此,通过 GPG 生成 SSH 专用密钥的过程就结束了。

创建用于 代码签名 的子密钥

检查密钥邮箱

备注: 如果在初次使用的时候输入的邮箱不是 GitHub 或者 GitLab 的邮箱。

那么需要在编辑密钥 gpg --expert --edit-key D188A1DD832AB894 的交互中通过 adduid 给主密钥添加对应的邮箱。

$ gpg --edit-key D188A1DD832AB894 # 编辑主密钥
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

sec ed25519/D188A1DD832AB894
创建于:2024-03-24 有效至:永不 可用于:SC
信任度:绝对 有效性:绝对
ssb cv25519/2978529F4782B600
创建于:2024-03-24 有效至:永不 可用于:E
ssb rsa4096/EFA3B0684ECE9D91
创建于:2024-03-24 有效至:永不 可用于:AR
[ 绝对 ] (1). zebedy <zebedy@example.com>

gpg> adduid
真实姓名: github name # GitHub/GitLab 用户名(也可以不和用户名一致)
电子邮件地址: github@gmail.com # GitHub/GitLab 邮箱(必须一致)
注释: github # 可选
您选定了此用户标识:
“github name (github) <github@gmail.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O

sec ed25519/D188A1DD832AB894
创建于:2024-03-24 有效至:永不 可用于:SC
信任度:绝对 有效性:绝对
ssb cv25519/2978529F4782B600
创建于:2024-03-24 有效至:永不 可用于:E
ssb rsa4096/EFA3B0684ECE9D91
创建于:2024-03-24 有效至:永不 可用于:AR
[ 绝对 ] (1) zebedy <zebedy@example.com>
[ 未知 ] (2). github name (github) <github@gmail.com>

gpg> save # save 保存退出

然后查看密钥信息就可以看到已经包含新的 uid 了。

$ gpg --list-keys --keyid-format=long
[keyboxd]
---------
pub ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid [ 绝对 ] github name (github) <github@gmail.com>
uid [ 绝对 ] zebedy <zebedy@example.com>
sub cv25519/2978529F4782B600 2024-03-24 [E]
sub rsa4096/EFA3B0684ECE9D91 2024-03-24 [AR]

生成子密钥

和上面生成创建用于 SSH 鉴权的子密钥子密钥的过程类似,但是这里我们不需要自定义密钥功能。所以不必使用 --expert 参数

这里密钥类型可以选择 ECC 也可以选择 RSA,但是注意,不管是 ECC 还是 RSA,都需要选择包含 仅用于签名 的选项。

这里我就用 ECC 举例,具体过程就不再赘述,和上面创建子密钥的过程基本一致,只是没有了自定义密钥功能,过程更简单了。

创建完成后同样记得使用 save 保存后自动退出 GPG 的交互环境,然后查询一下当前的密钥。

$ gpg --list-keys --keyid-format=long
[keyboxd]
---------
pub ed25519/D188A1DD832AB894 2024-03-24 [SC]
A31F6E522B93990CA1A1C548D188A1DD832AB894
uid [ 绝对 ] github name (github) <github@gmail.com>
uid [ 绝对 ] zebedy <zebedy@example.com>
sub cv25519/2978529F4782B600 2024-03-24 [E]
sub rsa4096/EFA3B0684ECE9D91 2024-03-24 [AR]
sub ed25519/0623CAE2AAFF25C2 2024-03-24 [S]

就看到了新创建的密钥 0623CAE2AAFF25C2 用途只有 [S],只用于签名。

查询子密钥公钥

通过 --export 查询子密钥公钥,但是默认是二进制的格式,所以还需要 --armor 显示为文本格式才能使用。

$ gpg --armor --export 0623CAE2AAFF25C2! # 注意这里在密钥摘要末尾有一个英文的感叹号!
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZf+fkxYJKwYBBAHaRw8BAQdA8JIOJ9bqkGIH/b2Q5B8iLeYC7KhGy8I5AesQ
Vgt2eju0J2dpdGh1YiBuYW1lIChnaXRodWIpIDxnaXRodWJAZ21haWwuY29tPoiT
BBMWCgA7FiEEox9uUiuTmQyhocVI0Yih3YMquJQFAmX/pYwCGwMFCwkIBwICIgIG
FQoJCAsCBBYCAwECHgcCF4AACgkQ0Yih3YMquJSl/wEAqpJRTjfRuUiCrYuIPech
ffae/iYtz4St5xtgsgfVRi8BAPcAU9+HLFHZCK80vpiEVlp1jhCIUihetVuxzTJ6
6x8AtBt6ZWJlZHkgPHplYmVkeUBleGFtcGxlLmNvbT6IkwQTFgoAOxYhBKMfblIr
k5kMoaHFSNGIod2DKriUBQJl/5+TAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H
AheAAAoJENGIod2DKriUPxgA/1g/tpw/gRrf6zwCVPQfuG5pgV25nqJlHNLqKv2c
k8+FAP4ri6zN9Ay5QQX1lEU3xQROGq53irN/ZPBI6d0EP9q5B7gzBGX/pv8WCSsG
AQQB2kcPAQEHQIrZWY1psJL/ELYuNi5lXSSUeWLw8wjHA+YvDiLxUyiXiO8EGBYK
ACAWIQSjH25SK5OZDKGhxUjRiKHdgyq4lAUCZf+m/wIbAgCBCRDRiKHdgyq4lHYg
BBkWCgAdFiEEhVrKN2SCNk5enPJMBiPK4qr/JcIFAmX/pv8ACgkQBiPK4qr/JcKo
qAD9HGRow6SUGM7ySZXLxPa/AWa2iHnmbru3z7HheRSZ4q8A/jiCY75rPpsOjT6k
rRejWTCDEJFL5SLdnWSsFwzbTQUE5FUA/j/CphTxuujBMdu/52EHwYg5Bo2+eeLp
AFNyPSyt71g0AQDNhS5X8GQ1GSBZ5CvBRZ/fRd0vShn3kikkTt51UP9OBA==
=qGsF
-----END PGP PUBLIC KEY BLOCK-----

为什么要在摘要末尾添加一个 ! 号呢?

因为如果没有这个感叹号则会导出这个子密钥所属的主密钥下的所有公钥。

$ gpg --armor --export 0623CAE2AAFF25C2 # 这里没有感叹号,发现内容相比上面长了很多
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=7KWW
-----END PGP PUBLIC KEY BLOCK-----

因为我们只需要这个子密钥,所以使用 ! 只包含该子密钥的公钥就行。

然后将该公钥添加到 GitHub 或者 GitLab 中即可。

配置 Git

给 Git 全局配置签名 Key

git config --global user.signingkey 0623CAE2AAFF25C2!

如果不需要自动使用 GPG 签名代码,可以每次在 commit 的时候使用 -S 参数(大写S)进行签名

如果想提交的时候自动签名,可以进行配置。

git config --global commit.gpgsign true

然后再次提交代码后就可以查看签名信息了。

git log --show-signature

同时 pushGitHub 上后也可以看到提交有一个 verified 的标记。

至此,创建用于代码签名的子密钥结束。