如何显示 gpg 密钥细节而不导入它?

我有一个 postgreql apt 存储库 gpg 密钥的副本,希望在文件中查看 gpg 密钥的详细信息。不把它导入钥匙圈就可以做到这一点吗?

185453 次浏览

--list-packets选项解析文件中的 pgp 数据并输出其结构——尽管是以一种非常技术性的方式。在解析公钥时,可以轻松地提取签名的用户 ID 和密钥 ID。

注意,这个命令 只有解析数据格式,它不验证签名或类似的东西。

在查看 OpenPGP 关键数据时,您可以获得几个详细级别: 基本摘要、此摘要的机器可读输出或单个 OpenPGP 数据包的详细(非常技术性)列表。

基本主要资料

对于 OpenPGP 密钥文件的简短峰值,您可以简单地通过 STDIN 将文件名作为参数或管道传递到密钥数据中。如果没有传递任何命令,GnuPG 会尝试猜测您想要做什么——对于键数据,这是在键上打印一个摘要:

$ gpg a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192 2012-12-25 [SC]
0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid           Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid           Jens Erat <jens.erat@fsfe.org>
uid           Jens Erat <jens.erat@uni-konstanz.de>
uid           Jens Erat <jabber@jenserat.de>
uid           Jens Erat <email@jenserat.de>
uid           [jpeg image of size 12899]
sub   rsa4096 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096 2016-02-24 [A] [expires: 2020-02-23]

通过设置 --keyid-format 0xlong,打印长键 ID而不是 不安全的短密钥 ID:

$ gpg a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192/0x4E1F799AA4FF2279 2012-12-25 [SC]
0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid                             Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid                             Jens Erat <jens.erat@fsfe.org>
uid                             Jens Erat <jens.erat@uni-konstanz.de>
uid                             Jens Erat <jabber@jenserat.de>
uid                             Jens Erat <email@jenserat.de>
uid                             [jpeg image of size 12899]
sub   rsa4096/0x0F3ED8E6759A536E 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096/0x2D6761A7CC85941A 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048/0x9FF7E53ACB4BD3EE 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048/0x5C88F5D83E2554DF 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096/0x8E78E44DFB1B55E9 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096/0xCC73B287A4388025 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096/0x382D23D4C9773A5C 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096/0xFF37A70EDCBB4926 2016-02-24 [A] [expires: 2020-02-23]
pub   rsa1024/0x7F60B22EA4FF2279 2014-06-16 [SCEA] [revoked: 2016-08-16]

提供 -v-vv甚至会添加一些更多的信息。在这种情况下,我更喜欢打印包的详细信息(见下文)。

机读输出

GnuPG 还有一个冒号分隔的输出格式,这种格式很容易解析,并且具有稳定的格式。格式在 GnuPG doc/DETAILS文件中有文档说明.接收此格式的选项是 --with-colons

$ gpg --with-colons a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub:-:8192:1:4E1F799AA4FF2279:1356475387:::-:
uid:::::::::Jens Erat (born 1988-01-19 in Stuttgart, Germany):
uid:::::::::Jens Erat <jens.erat@fsfe.org>:
uid:::::::::Jens Erat <jens.erat@uni-konstanz.de>:
uid:::::::::Jens Erat <jabber@jenserat.de>:
uid:::::::::Jens Erat <email@jenserat.de>:
uat:::::::::1 12921:
sub:-:4096:1:0F3ED8E6759A536E:1356517233:1482747633:::
sub:-:4096:1:2D6761A7CC85941A:1356517456:1482747856:::
sub:-:2048:1:9FF7E53ACB4BD3EE:1358985314:1674345314:::
sub:-:2048:1:5C88F5D83E2554DF:1358985467:1674345467:::
sub:-:4096:1:8E78E44DFB1B55E9:1395870592:1599164118:::
sub:-:4096:1:CC73B287A4388025:1395870720:1599164118:::
sub:-:4096:1:382D23D4C9773A5C:1416680427:1479752427:::
sub:-:4096:1:FF37A70EDCBB4926:1456322829:1582466829:::

从 GnuPG 2.1.23开始,可以通过使用 --import-options show-only选项和 --import命令来省略 gpg: WARNING: no command supplied. Trying to guess what you mean ...警告(当然,在没有 --with-colons的情况下也可以这样做) :

$ gpg --with-colons --import-options show-only --import a4ff2279
[snip]

对于旧版本: 警告消息是打印在 STDERR 上的,所以您可以只读 STDIN 来将密钥信息从警告中分离出来。

技术细节: 列出 OpenPGP 数据包

不需要安装任何进一步的包,您可以使用 gpg --list-packets [file]查看文件中包含的 OpenPGP 包的信息。

$ gpg --list-packets a4ff2279.asc
:public key packet:
version 4, algo 1, created 1356475387, expires 0
pkey[0]: [8192 bits]
pkey[1]: [17 bits]
keyid: 4E1F799AA4FF2279
:user ID packet: "Jens Erat (born 1988-01-19 in Stuttgart, Germany)"
:signature packet: algo 1, keyid 4E1F799AA4FF2279
version 4, created 1356516623, md5len 0, sigclass 0x13
digest algo 2, begin of digest 18 46
hashed subpkt 27 len 1 (key flags: 03)
[snip]

pgpdump [file]工具的工作原理类似于 gpg --list-packets,并提供类似的输出,但是将所有这些算法标识符解析为可读的表示。它可能适用于所有相关的发行版(在 Debian 衍生品上,这个包被称为 pgpdump,就像这个工具本身一样)。

$ pgpdump a4ff2279.asc
Old: Public Key Packet(tag 6)(1037 bytes)
Ver 4 - new
Public key creation time - Tue Dec 25 23:43:07 CET 2012
Pub alg - RSA Encrypt or Sign(pub 1)
RSA n(8192 bits) - ...
RSA e(17 bits) - ...
Old: User ID Packet(tag 13)(49 bytes)
User ID - Jens Erat (born 1988-01-19 in Stuttgart, Germany)
Old: Signature Packet(tag 2)(1083 bytes)
Ver 4 - new
Sig type - Positive certification of a User ID and Public Key packet(0x13).
Pub alg - RSA Encrypt or Sign(pub 1)
Hash alg - SHA1(hash 2)
Hashed Sub: key flags(sub 27)(1 bytes)
[snip]

我似乎能够很简单地处理:

$gpg <path_to_file>

结果如下:

$ gpg /tmp/keys/something.asc
pub  1024D/560C6C26 2014-11-26 Something <something@none.org>
sub  2048g/0C1ACCA6 2014-11-26

操作没有特别指定哪些关键信息是相关的。这个输出是我所关心的。

要验证和列出密钥的指纹(不首先将其导入 keyring) ,输入

gpg --show-keys --with-fingerprint <filename>

编辑: 在 Ubuntu18.04(gpg2.2.4)上,上面的命令没有显示指纹。改用 --with-subkey-fingerprint选项

gpg --show-keys --with-subkey-fingerprint <filename>

当我偶然发现这个答案时,我正在寻找一种方法来获得一个容易解析的输出。对我来说,选择 --with-colons就可以解决这个问题:

$ gpg --with-colons file
sec::4096:1:AAAAAAAAAAAAAAAA:YYYY-MM-DD::::Name (comment) email
ssb::4096:1:BBBBBBBBBBBBBBBB:YYYY-MM-DD::::

文档可以找到 给你

pgpdump(https://www.lirnberger.com/tools/pgpdump/)是一个可以用来检查 pgp 块的工具。

它不是用户友好的,而且相当技术性,但是,

  • 它解析公钥或私钥(没有警告)
  • 它不修改任何 keyring (根据我的经验,有时 gpg 在引擎盖后面做什么并不那么清楚)
  • 它打印所有的数据包,特别是用户标识的数据包,显示关于密钥的各种文本数据。
pgpdump -p test.asc
New: Secret Key Packet(tag 5)(920 bytes)
Ver 4 - new
Public key creation time - Fri May 24 00:33:48 CEST 2019
Pub alg - RSA Encrypt or Sign(pub 1)
RSA n(2048 bits) - ...
RSA e(17 bits) - ...
RSA d(2048 bits) - ...
RSA p(1024 bits) - ...
RSA q(1024 bits) - ...
RSA u(1020 bits) - ...
Checksum - 49 2f
New: User ID Packet(tag 13)(18 bytes)
User ID - test (test) <tset>
New: Signature Packet(tag 2)(287 bytes)
Ver 4 - new
Sig type - Positive certification of a User ID and Public Key packet(0x13).
Pub alg - RSA Encrypt or Sign(pub 1)
Hash alg - SHA256(hash 8)
Hashed Sub: signature creation time(sub 2)(4 bytes)
Time - Fri May 24 00:33:49 CEST 2019
Hashed Sub: issuer key ID(sub 16)(8 bytes)
Key ID - 0x396D5E4A2E92865F
Hashed Sub: key flags(sub 27)(1 bytes)
Flag - This key may be used to certify other keys
Flag - This key may be used to sign data
Hash left 2 bytes - 74 7a
RSA m^d mod n(2048 bits) - ...
-> PKCS-1

不幸的是,它没有读取 stdin:/

您也可以使用 --keyid-format开关显示短键或长键 ID:

$ gpg2 -n --with-fingerprint --keyid-format=short --show-keys <filename>

输出如下(例如 PostgreSQL CentOS repo key) :

pub   dsa1024/442DF0F8 2008-01-08 [SCA]                                                                       │
Key fingerprint = 68C9 E2B9 1A37 D136 FE74  D176 1F16 D2E1 442D F0F8                                    │              honor-keyserver-url
uid                    PostgreSQL RPM Building Project <pgsqlrpms-hackers@pgfoundry.org>                      │                     When  using --refresh-keys, if the key in question has a preferred keyserver URL, then use that
sub   elg2048/D43F1AF8 2008-01-08 [E]

要获得密钥 ID (8字节,16个十六进制数字) ,这是在 GPG 1.4.16、2.1.18和2.2.19中使用的命令:

gpg --list-packets <key.asc | awk '$1=="keyid:"{print$2}'

要获得更多信息(除了密钥 ID 之外) :

gpg --list-packets <key.asc

为了获得更多信息:

gpg --list-packets -vvv --debug 0x2 <key.asc

命令

gpg --dry-run --import <key.asc

同样适用于所有3个版本,但是在 GPG 1.4.16中它只打印一个短的密钥 ID (4字节,8个十六进制数字) ,所以识别密钥的安全性较差。

其他答案中的一些命令(例如 gpg --show-keysgpg --with-fingerprintgpg --import --import-options show-only)在上述3个 GPG 版本中的某些版本中无法工作,因此它们在针对多个 GPG 版本时不能移植。