子密钥
主私钥有所有功能,但实际使用中仅用来生成子密钥,要保证主密钥的绝对安全。
所以一般只用来生成子密钥,使用子密钥参与工作。
即:subkey
,可以看到子密钥拥有以下这些功能,除了没有认证功能
类型 | 认证 [C] | 签名 [S] | 身份验证 [A] | 加密 [E] |
---|---|---|---|---|
主私钥 | 有 | 有 | 有 | 有 |
子私钥 | 无 | 有 | 有 | 有 |
单一公钥机制对于服务端的验证特别友好,无论用户有多少个子密钥,服务器只需要一份证书(公钥)就够了,而不需要额外开销,去查询这份证书是哪个上级签发的。 什么叫单一公钥机制? 就是主密钥生成一个公钥,所有的子私钥都可以对这个公钥进行签名、身份验证、加密操作。
生成子密钥
子密钥可以指定上面的:[S]、[A]、[E] 的功能,可以全部拥有,也可以功能独立,取决于在添加时的指定。
代码语言:javascript复制gpg --expert --edit-key [用户ID]
参数说明:
--expert
:进入gpg命令模式
--edit-key
:操作用户ID
输入addkey
,添加子密钥,选择一种加密模式,选 4
gpg> addkey
请选择您要使用的密钥类型:
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(5) ElGamal(仅用于加密)
(6) RSA(仅用于加密)
(7) DSA(自定义用途)
(8) RSA(自定义用途)
(10) ECC(仅用于签名)
(11) ECC(自定义用途)
(12) ECC(仅用于加密)
(13) 现存的密钥
(14)卡中现有密钥
选择长度
代码语言:javascript复制RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072)
请求的密钥长度是 3072 位
选择一个有效期:1y 表示一年
代码语言:javascript复制请设定这个密钥的有效期限。
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
验证子密钥
查看刚生成的子密钥:
代码语言:javascript复制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]
导出子密钥
实际使用中,主密钥不会直接参与验证工作,而是生成多个子密钥去工作,这样做的好处是,子密钥如果泄露可以吊销,子密钥的功能也是有限的。
将生成的子密钥发送给服务端进行验证工作。
代码语言:javascript复制gpg --armor --output private-key.txt --export-secret-subkey [用户ID]
参数说明:
--armor
: 以ASCII形式显示,不推存,容易密钥暴露明文
--export-secret-subkey
:导出子密钥
--output
:子密钥文件名
GPG 吊销证书
这个就是字面意思,吊销证书。场景就是如果私钥丢失了,那么原来的公钥也就不能信任了。 所以可以生成一个员销证书,来吊销原来的证书。
因此 GPG 多了一个“吊销证书”(revocation certificate),拿着这个证书你就能证明
- 确认吊销者身份
- 把丢失当前这个密钥作废