我的 OpenPGP 私钥设置有子密钥。如果我撤销一个子密钥并重新颁发一个新的会发生什么?

信息安全 加密 公钥基础设施 密钥管理 pgp gnupg
2021-08-11 06:06:45

我已经按照“创建完美的 GPG 密钥对”中的一般说明设置了带有子密钥的 OpenPGP密钥一般要点是您创建一个“主密钥对”,它存储在您的笔记本电脑上,而是存储在一个安全的气隙设备上。就我而言,它是一个加密的 USB 密钥。我还有一个纸质密钥版本,以及打印的主密钥撤销密钥,以防数字版本丢失或损坏。我的笔记本电脑只有子密钥,没有主签名密钥。结果,当您运行gpg -K(显示密钥)时,您会得到:

/Users/myusername/.gnupg/secring.gpg
-------------------------------
sec#  4096R/0x123412341234FFFF 2014-04-18
uid                            My Name <me@example.com>
ssb   4096R/0x123412341234AAAA 2014-04-18
ssb   4096R/0x123412341234BBBB 2014-09-24
ssb   4096R/0x123412341234CCCC 2014-09-30

sec#表示主签名密钥未存储在计算机上如果我加载我的加密 USB 密钥然后运行gpg gpg --home=/path/to/secure/gpg/keys/.gnupg -K,它会显示:

/path/to/secure/gpg/keys/.gnupg/secring.gpg
-------------------------------
sec  4096R/0x123412341234FFFF 2014-04-18
uid                            My Name <me@example.com>
ssb   4096R/0x123412341234AAAA 2014-04-18
ssb   4096R/0x123412341234BBBB 2014-09-24
ssb   4096R/0x123412341234CCCC 2014-09-30

如您所见,它显示sec,而不是sec#

在此设置下,如果您的笔记本电脑遭到入侵,您可以安全地撤销子密钥,而不会失去与信任网络的任何连接 - 因为您通过主签名密钥连接到信任网络。


假设我的笔记本电脑受到了损害,这种模型应该可以防止这种情况发生。我认为最好的做法是:

  1. 去获取我的安全 USB 密钥,并从安全密钥环加载 GnuPG
  2. 使用主密钥对,我会撤销我的子密钥 [因为它们现在已被泄露]
  3. 现在,我将发布用于签名和加密的新子密钥,并将所有这些更改推送到公钥服务器。

我的问题是:这是正确的做法吗?当你这样做时,这里到底发生了什么?我认为它会生成一个新的私钥/公钥对,并使旧的无效。这样,如果对手拥有我的旧私钥 - 他们理论上可以访问加密到我的旧公钥的旧通信。但是他们不能像我一样签署任何东西,因为那个私钥将被撤销。此外,当有人通过密钥服务器查找我时,旧公钥和新公钥都将可见,但旧公钥将显示为已撤销,新公钥将具有更新的日期,因此 GnuPG 用户试图发送给我加密消息或加密文件将自动将其加密为新的(未撤销的)公钥。并且对手将无法阅读此消息。

我完全正确吗?有人可以澄清一下吗?

1个回答

我的问题是:这是正确的做法吗?当你这样做时,这里到底发生了什么?我认为它会生成一个新的私钥/公钥对,并使旧的无效。这样,如果对手拥有我的旧私钥 - 他们理论上可以访问加密到我的旧公钥的旧通信。但是他们不能像我一样签署任何东西,因为那个私钥将被撤销。此外,当有人通过密钥服务器查找我时,旧公钥和新公钥都将可见,但旧公钥将显示为已撤销,新公钥将具有更新的日期,因此 GPG 用户试图发送给我加密消息或加密文件将自动将其加密为新的(未撤销的)公钥。并且对手将无法阅读此消息。

你几乎做对了一切;这正是子密钥的主要用途(除了交换子密钥而不会在信任网络中失去声誉之外,还有其他一些简洁的用例)。

我要补充一点,可能存在给定的延迟:密钥需要一些时间(通常是几分钟,不到一小时)才能在整个密钥服务器网络中传播。如果情况很危急,并且您知道有人正在监听您的通信,请考虑上传到 SKS 服务器池中的不同服务器,以加快密钥的协调/传播。

此外,您的通信伙伴很可能只会偶尔获取您的密钥更新。考虑发送有关由于旧子密钥受损而更改的子密钥的信息;并解释为什么你的主密钥仍然保存。