GPG 在创建密钥的时候会提示设置密钥有效期,有效期是在出现丢失私钥,又无法主动吊销密钥时的最后防线,当密钥所有人失去私钥控制权时,只要密钥超出有效期,那么其他人也会得知该密钥已经失效。
我在创建 GPG 密钥的时候,保险起见也设置了有效期,最近有效期快到了,趁着更新自己的密钥,写一篇经验总结给各位刚入坑 GPG 的初学者们,如有建议欢迎指出~
将主私钥导入到 GPG 中
首先使用 gpg --import <私钥文件>
来导入主私钥(这里以 Alice 的密钥为例子):
$ gpg --import .\Alice_SECRET.asc
gpg: key 563686B06D454F9E: public key "Alice <[email protected]>" imported
gpg: key 563686B06D454F9E: secret key imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: secret keys read: 1
gpg: secret keys imported: 1
导入完成后,使用 gpg --list-secret
检查是否成功导入主私钥:
$ gpg --list-secret
sec ed25519 2023-06-03 [SC] [expires: 2025-06-02]
D215AA7B122F3CCEFA366552563686B06D454F9E
uid [ unknown] Alice <[email protected]>
ssb cv25519 2023-06-03 [E] [expires: 2025-06-02]
如果有出现你的密钥,且 sec 后面不带井号(#),就算是导入成功了。
如果你的密钥,sec 后面带有井号,那么请检查你的私钥文件是否包含主私钥,并尝试重新导入。
$ gpg --list-secret
# 如果导入的私钥文件不包含主私钥,那么 sec 会显示成下面这样
sec# ed25519 2023-06-03 [SC] [expires: 2025-06-02]
D215AA7B122F3CCEFA366552563686B06D454F9E
uid [ultimate] Alice <[email protected]>
ssb cv25519 2023-06-03 [E] [expires: 2025-06-02]
编辑密钥
密钥中的信息,通过自签名绑定到密钥中,公钥中除了主公钥外,其他信息都会包含由主密钥签署的签名数据,通过主密钥对信息的签名,将信息绑定到了主密钥。
更新密钥有效期
首先,使用命令 gpg --edit-key <用户ID/密钥ID>
进入密钥编辑模式:
$ gpg --edit-key Alice
gpg (GnuPG) 2.4.0; Copyright (C) 2021 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.
Secret key is available.
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2025-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1). Alice <[email protected]>
gpg>
如果导入密钥成功,gpg 会输出“Secret key is available.”。
然后执行命令 expire
,修改密钥的有效,比如给密钥设置有效期为 1 年后过期:
gpg> expire
Changing expiration time for the primary key.
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
# 此处按照上面的提示,输入所需的有效期
Key is valid for? (0) 1y
Key expires at 2024/6/3 1:59:56
# 确定无误后输入 y 并回车,然后按照提示输入主密钥密码,或者插入物理密钥进行签名。
Is this correct? (y/N) y
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2024-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1). Alice <[email protected]>
gpg>
确定修改后不会立刻保存到密钥,还需要保存,但如果你需要修改其他信息,可以不用退出编辑模式,请继续往下看。(如果你不需要修改其他信息的话,可以看“保存密钥”小节)
修改密钥的用户标识
如果你的网名出现了变更,或者你想新增新的邮箱,那就需要修改用户标识(User Id,简称 uid)。
添加新的用户标识
添加新的联系方式就需要使用 adduid
命令
gpg> adduid
# 这里填入新的用户名
Real name: Alice
# 输入新的邮箱地址
Email address: [email protected]
# 如果需要,可以填写关于这个用户标识的注释,不需要的话留空即可
Comment: Alice's other email
You selected this USER-ID:
"Alice (Alice's other email) <[email protected]>"
# 如果有哪个选项填错了,可以输入对应的字母重新编辑,如果没问题,输入 o 回车即可。
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2025-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1) Alice <[email protected]>
[ unknown] (2). Alice (Alice's other email) <[email protected]> # 可以看到新增了一个用户标识
删除用户标识
如果你的某个联系方式已经失效了,就需要将这个联系方式的用户标识删除。
首先需要使用 list 查看已有的用户标识,然后使用 uid <序号>
选择需要删除的用户标识。
这里假设我们需要删除第二个用户标识:
gpg> list
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2025-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1) Alice <[email protected]>
[ unknown] (2). Alice (Alice's other email) <[email protected]>
gpg> uid 2
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2025-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1) Alice <[email protected]>
[ unknown] (2)* Alice (Alice's other email) <[email protected]>
gpg>
使用 uid
命令选择第二个用户标识后,会看到第二个用户标识的序号后面多了一个星号(*),代表这个用户标识被选中了,uid
命令可以选择多个用户标识,对批量操作比较友好,如果你选错了用户标识,只需要重新执行一次 uid
命令即可取消选择。
选择好后,我们执行 deluid 删除选中的用户标识:
gpg> deluid
Really remove this user ID? (y/N) y
sec ed25519/563686B06D454F9E
created: 2023-06-03 expires: 2025-06-02 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/735E356B82D3E3A0
created: 2023-06-03 expires: 2025-06-02 usage: E
[ultimate] (1) Alice <[email protected]>
gpg>
执行完后,可以看到被选中的第二个用户标识被删除。
修改用户标识
gpg 并没有提供直接修改用户标识的操作,因此你需要先将旧的用户标识删除后,再使用 adduid
命令把新的用户标识添加进去。
保存密钥(或者放弃修改)并退出
当你完成了修改后,需要使用 quit
命令保存密钥修改并退出编辑模式:
gpg> quit
Save changes? (y/N) y
如果你在编辑过程中出现失误,也可以输入 n 选择不保存修改并退出,然后重新进入编辑模式,重新编辑即可。
如果你非常肯定你的修改无误,可以直接使用 save
命令保存并退出:
gpg> save
# 这样就不会询问你是否需要保存密钥,直接保存并退出。
将修改后的公钥发布出去
保存修改后,你还需要把新的公钥发布给他人,你可以按照先前发布的渠道,重新发布一次密钥即可。
这里推荐几个不错的密钥发布渠道:
- Ubuntu 的公共密钥服务器 – 比较好用的公共密钥服务器。
- Keybase – 在线身份证明平台,可以在上面关联自己的各种平台账户,以证明所有权。
- PGP 全球密钥目录 – 该密钥服务器会对密钥中的电子邮箱发送确认邮件,以减少无效的密钥,相比于其他密钥服务器的可信度较高。
- Github – 如果有 Github 账户的话,也可以将 GPG 密钥绑定到 Github 中,然后使用
https://github.com/<用户名>.gpg
来获取密钥。
刚好到期了,过来学习学习。