如何在不导入 gpg 密钥的情况下显示其详细信息?

207

我有一个postgresql apt软件库的gpg密钥副本,并希望查看文件中密钥的详细信息。是否可以在不将其导入密钥环的情况下实现?

9个回答

229

查看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 命令中使用 --import-options show-only 选项来省略 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]

2
谢谢。我刚刚使用了"gpg --list-keys path-to-key-file" 并获得了我想要看到的内容: ... 哈希的子数据包2长度4 (签名创建于2013-02-24) 哈希的子数据包9长度4 (密钥在4年134天23小时24分钟后过期) ... 而pgpdump使输出更易读。 - Capt. Crunch
1
@JonathanCross 确实,所描述的输出听起来像是 --list-packets - Jens Erat
2
如何消除这个丑陋的“WARNING: no command supplied”到stderr?(这会阻碍在脚本中正确使用gpg。当涉及加密时,唯一安全的方法是将任何输出到stderr视为致命错误。只有这样,当发现仅打印到stderr的新重要弱点时,您才会做好准备)。 - Tino
1
我不知道有什么简单的方法可以解决这个问题。你仍然可以将密钥文件作为密钥环使用,然后运行 --list-keys 命令,例如 gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys。或者直接忽略警告信息,在 (ba)sh 脚本中有一堆选项可以过滤 stderr - Jens Erat
8
--import-options show-only --import 的另一种替代方法是 --show-keys,该选项似乎是在 2019 年初左右添加的 [编辑:大约在2.2.12-13版本,没有深入研究更改日志]。 (也提到了@Pawel's answer - mjbnz
显示剩余2条评论

68

要验证并列出密钥的指纹(而不是先将其导入到密钥环中),请键入

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

编辑:在Ubuntu 18.04(gpg 2.2.4)上,使用上述命令无法显示指纹。请改用--with-subkey-fingerprint选项。

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

6
我认为这应该是被接受的答案。我同意@Skyr发表的评论作为答案(链接:https://dev59.com/R2Eh5IYBdhLWcg3wrVLW#22147506)。 - gertvdijk
3
好的,这很好,不需要本地个人密钥环等,可以显示密钥名称...效果最佳。 - Florian Heigl
1
由于某些未知/未记录的原因,“gpg --with-fingerprint”在我的一侧会抑制打印指纹。Ubuntu 18.04“gpg(GnuPG)2.1.18”。 - Tino
我也遇到了同样的问题,@Tino,你有没有找到任何关于为什么的额外信息? - kjones
@Tino 和 @kjones 更新了答案,加入了 --with-subkey-fingerprint 的信息,这应该适用于 Ubuntu 18.04。 - Ronny Andersson
1
在Arch上,gpg --show-keys <keyfile> 产生相同的输出,但没有 @JensErat 提到的“WARNING…”。 - joharr

33

我似乎能够简单地相处:

$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

这位用户没有特别说明哪些关键信息是相关的。这个输出结果是我唯一关心的。


1
这将创建~/.gnupg/pubring.kbx。因此,该方法是具有侵入性的。 - gavenkoa
@gavenkoa 没错!为了避免这种情况,最好执行 gpg <filename> 2>&1 - lacostenycoder

10

您还可以使用--keyid-format开关来显示短或长的密钥ID:

$ gpg2 -n --with-fingerprint --keyid-format=short --show-keys <filename>
该输出结果如下(以PostgreSQL CentOS仓库密钥为例):
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]

9
选项--list-packets从文件中解析pgp数据并以非常技术性的方式输出其结构。当解析公钥时,您可以轻松提取签名的用户ID和密钥ID。
请注意,此命令仅解析数据格式,不验证签名或类似内容。

对于一个 签名 .asc 文件(而不是 公钥 .asc 文件),使用 gpg 2.2.27,gpg --list-packets some-signature.asc 似乎是提取包含的指纹的唯一方法。 - Abdull

5

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

这个方法在所有三个版本中都可以工作,但在GPG 1.4.16中只会打印一个短的(4字节,8十六进制数)密钥ID,因此识别密钥的安全性较低。

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


3

对于gngpg版本2.2.8及以上的新版本:

如果您仅需要获取密钥的指纹,而不导入密钥且无需将stderr重定向到stdout 2>&1
(例如:当您有脚本验证指纹后再像ansible一样进行操作时)


我提供了两种方式,分别是使用--with-colons和不使用--with-colons,取决于您的脚本偏好。

获取短格式密钥ID

  • 短密钥ID格式(使用--show-keys--with-colons):
gpg --show-keys --with-colons keyfile.key | awk -F':' '$1=="pub"{print $5}'

  • 短密钥 ID 格式(使用 --list-packets):
gpg --list-packets keyfile.key | awk '$1=="keyid:"{print$2}'

获取长格式的密钥ID

  • 长格式密钥ID(使用--show-keys--with-colons):
gpg --show-keys --with-colons keyfile.key | awk -F':' '$1=="fpr"{print $10}'
  • 长密钥ID格式(使用--show-keys):
gpg --show-keys keyfile.key | sed -nr 's/^([ ]+)([0-9A-Z]{40}$)/\2/p'


2

当我发现这个答案时,我正在寻找一种易于解析的输出方式。对我而言,选项--with-colons就可以胜任:

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

文档可以在这里找到。


1
你怎么得到那种漂亮的YYYY-MM-DD输出格式?我无法使用gpg2.x和--with-colons重现它。 - MKesper

1

pgpdumphttps://www.lirnberger.com/tools/pgpdump/)是一个工具,您可以使用它来检查pgp块。

它不太友好,相当技术化,但是:

  • 它解析公钥或私钥(没有警告)
  • 它不修改任何密钥环(有时不清楚gpg在幕后做了什么,根据我的经验)
  • 它打印所有数据包,特别是用户ID数据包,这些数据包显示有关密钥的各种文本数据。
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) : /


我的 pgpdumpstdin 读取数据。例如,curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdump 可以正常工作。 - rickhg12hs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接