为什么 gpg --list-keys 有时打印子键,有时不打印?

Jen*_*rat 18 gnupg openpgp

这个问题出现在“如何以不那么黑客的方式显示我的加密密钥的使用标志? ”的评论中,似乎值得以问答形式回答,因为答案实际上并不明显。

要查看 Torvald 的 OpenPGP 密钥 449FA3AB,我使用gpg2 --list-keys 449FA3AB,它输出

$ gpg2 --list-keys 449FA3AB
pub   1024D/449FA3AB 1999-10-05 [expired: 2001-10-04]
uid       [ expired] Linus Torvalds <torvalds@transmeta.com>
Run Code Online (Sandbox Code Playgroud)

通常,此命令还会列出子键,但不会为 Torvald 的键打印子键。然而,当请求批量输出时,包含一个。

$ gpg2 --with-colons --list-keys 449FA3AB
tru::1:1414619239:1414879758:3:1:5
pub:e:1024:17:956EB7BF449FA3AB:939086351:1002158351::-:::sca:
uid:e::::939086351::81A3799583B9B1B391E4C428112F302FF2ADF462::Linus Torvalds <torvalds@transmeta.com>:
sub:e:2048:16:71CE8207BFF491C5:939086545:1002158545:::::e:
Run Code Online (Sandbox Code Playgroud)

似乎这个 Torvalds-key 有一些隐藏子键的特殊功能。这里发生了什么?

Jen*_*rat 20

过期密钥

这不是什么特别的功能,但是 Torvalds 的主键已经过期很久了,因此子键也过期了。答案隐藏在--list-options手册页的GnuPG部分,因为默认情况下过期的子键是隐藏的。来自man gpg2

show-unusable-subkeys
        Show revoked and expired subkeys in key listings. Defaults to no.
Run Code Online (Sandbox Code Playgroud)

通过指定此参数,子项将显示:

$ gpg2 --list-options show-unusable-subkeys --list-keys 449FA3AB
pub   1024D/449FA3AB 1999-10-05 [expired: 2001-10-04]
uid       [ expired] Linus Torvalds <torvalds@transmeta.com>
sub   2048g/BFF491C5 1999-10-05 [expired: 2001-10-04]
Run Code Online (Sandbox Code Playgroud)

时光倒流

您还可以使用有用的faketime程序来验证这一点,将 GnuPG 的系统时间设置回几年。通过回到 Torvalds 密钥有效的某个日期,子密钥将再次出现:

$ faketime 2001-01-01 gpg2 --list-keys 449FA3AB
pub   1024D/449FA3AB 1999-10-05 [expires: 2001-10-04]
uid       [ unknown] Linus Torvalds <torvalds@transmeta.com>
sub   2048g/BFF491C5 1999-10-05 [expires: 2001-10-04]
Run Code Online (Sandbox Code Playgroud)

  • 您要查找的文档存储在`/usr/share/doc/gnupg/DETAILS.gz`(不同发行版的路径可能不同)并且[在GnuPG git 存储库中](http://git.gitignore) 中也可用。 gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob_plain;f=doc/DETAILS)。查看“字段 12 - 关键功能”。 (2认同)