GPG 密钥快到期了?想添加新的联系信息?教你如何更新 GPG 密钥!
本文最后更新于 320 天前,其中的信息可能已经有所发展或是发生改变。

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 来获取密钥。

评论

  1. Yorlg
    Windows Chrome 119.0.0.0
    5 月前
    2023-11-09 10:57:58

    刚好到期了,过来学习学习。

本文评论已关闭
上一篇