子密钥

主私钥有所有功能,但实际使用中仅用来生成子密钥,要保证主密钥的绝对安全。
所以一般只用来生成子密钥,使用子密钥参与工作。
即:subkey,可以看到子密钥拥有以下这些功能,除了没有认证功能

类型 认证 [C] 签名 [S] 身份验证 [A] 加密 [E]
主私钥
子私钥

单一公钥机制对于服务端的验证特别友好,无论用户有多少个子密钥,服务器只需要一份证书(公钥)就够了,而不需要额外开销,去查询这份证书是哪个上级签发的。
什么叫单一公钥机制?
就是主密钥生成一个公钥,所有的子私钥都可以对这个公钥进行签名、身份验证、加密操作。

生成子密钥

子密钥可以指定上面的:[S]、[A]、[E] 的功能,可以全部拥有,也可以功能独立,取决于在添加时的指定。

1
gpg --expert --edit-key [用户ID]

参数说明:

--expert:进入gpg命令模式
--edit-key:操作用户ID

输入addkey,添加子密钥,选择一种加密模式,选 4

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

选择长度

1
2
3
4
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072)
请求的密钥长度是 3072 位
选择一个有效期:1y 表示一年
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 1y
创建时间要大概几秒,成功后的输出:DAF9C7421FB1B533为子密钥


sec rsa3072/D66E46924A7A4475
创建于:2023-01-03 有效至:2025-01-02 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/9FF7004AC3A0DB89
创建于:2023-01-03 有效至:2025-01-02 可用于:E
ssb rsa3072/DAF9C7421FB1B533
创建于:2023-01-04 有效至:2024-01-04 可用于:S
[ 绝对 ] (1). liukai <liukaitest@163.com>
最后输入save,保存后再退出当前模式。
gpg > save

验证子密钥

查看刚生成的子密钥:

1
2
3
4
5
6
7
8
9
gpg -k DAF9C7421FB1B533
输出:sub rsa3072为刚创建的子密钥


pub rsa3072 2023-01-03 [SC] [有效至:2025-01-02]
79A86B57A0DA913F0D76B5ACD66E46924A7A4475
uid [ 绝对 ] liukai <liukaitest@gmail.com>
sub rsa3072 2023-01-03 [E] [有效至:2025-01-02]
sub rsa3072 2023-01-04 [S] [有效至:2024-01-04]

导出子密钥

实际使用中,主密钥不会直接参与验证工作,而是生成多个子密钥去工作,这样做的好处是,子密钥如果泄露可以吊销,子密钥的功能也是有限的。

将生成的子密钥发送给服务端进行验证工作。

1
gpg --armor --output private-key.txt --export-secret-subkey [用户ID]

参数说明:

--armor: 以ASCII形式显示,不推存,容易密钥暴露明文
--export-secret-subkey:导出子密钥
--output:子密钥文件名

GPG 吊销证书

这个就是字面意思,吊销证书。场景就是如果私钥丢失了,那么原来的公钥也就不能信任了。
所以可以生成一个员销证书,来吊销原来的证书。

因此 GPG 多了一个“吊销证书”(revocation certificate),拿着这个证书你就能证明

  1. 确认吊销者身份
  2. 把丢失当前这个密钥作废