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

How to display gpg key details without importing it?

提问人:Capt. Crunch 提问时间:3/3/2014 最后编辑:Jens EratCapt. Crunch 更新时间:1/16/2023 访问量:222749

问:

我有 postgresql apt 存储库 gpg 密钥的副本,并想查看文件中 gpg 密钥的详细信息。这是否可以不将其导入密钥环?

GnuPG OpenPGP

评论


答:

9赞 Skyr 3/3/2014 #1

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

请注意,此命令解析数据格式,不对签名或类似内容进行验证。

评论

0赞 Abdull 3/23/2023
对于签名 .asc 文件(不是公钥 .asc 文件),使用 gpg 2.2.27 似乎是提取包含的指纹的唯一方法。gpg --list-packets some-signature.asc
231赞 Jens Erat 3/3/2014 #2

在查看 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 <[email protected]>
uid           Jens Erat <[email protected]>
uid           Jens Erat <[email protected]>
uid           Jens Erat <[email protected]>
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 <[email protected]>
uid                             Jens Erat <[email protected]>
uid                             Jens Erat <[email protected]>
uid                             Jens Erat <[email protected]>
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 <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
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 开始,可以通过将该选项与命令一起使用来省略警告(当然,这也可以不使用):gpg: WARNING: no command supplied. Trying to guess what you mean ...--import-options show-only--import--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] 工具的工作方式与提供类似的输出类似,但将所有这些算法标识符解析为可读表示形式。它可能可用于所有相关的发行版(在 Debian 衍生品上,软件包的名称类似于工具本身)。gpg --list-packetspgpdump

$ 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赞 Capt. Crunch 3/5/2014
谢谢。我只是使用了“gpg --list-keys path-to-key-file”并得到了我想看到的内容:......散列 subpkt 2 len 4 (SIG 创建于 2013-02-24) 散列 subpkt 9 len 4 (密钥在 4Y134D23H24M 后过期) ...pgpdump 使输出更具可读性。
1赞 Jens Erat 12/3/2018
@JonathanCross 事实上,所描述的输出听起来像 .--list-packets
2赞 Tino 3/25/2019
如何摆脱这个丑陋的stderr?(这阻碍了在脚本中正确使用。当涉及到加密货币时,唯一安全的方法是将任何输出到 stderr 视为致命错误。只有这样,当发现新的重要弱点时,您才能做好准备,这些弱点只能打印到 stderr)。WARNING: no command suppliedgpg
1赞 Jens Erat 3/25/2019
我不知道有一个简单的方法。不过,您仍然可以将密钥文件用作密钥环,然后运行类似 。或者干脆丢弃警告消息,有很多选项可以在 (ba)sh 脚本中过滤 stderr--list-keysgpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys
8赞 mjbnz 2/9/2021
另一种选择是,它似乎是在 2019 年初左右添加的 [编辑:~2.2.12-13 区域,没有深入研究更改日志]。(在@Pawel的回答中也提到--import-options show-only --import--show-keys )
33赞 Therealstubot 12/5/2014 #3

我似乎可以简单地相处:

$gpg <path_to_file>

其输出如下所示:

$ gpg /tmp/keys/something.asc 
  pub  1024D/560C6C26 2014-11-26 Something <[email protected]>
  sub  2048g/0C1ACCA6 2014-11-26

该操作没有具体说明哪些关键信息是相关的。这个输出是我所关心的。

评论

1赞 gavenkoa 6/8/2022
这将创建 .所以该方法是侵入性的(((~/.gnupg/pubring.kbx
0赞 lacostenycoder 3/3/2023
@gavenkoa 你是对的!为了避免这种情况,最好这样做gpg <filename> 2>&1
68赞 Ronny Andersson 3/9/2016 #4

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

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

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

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

评论

6赞 gertvdijk 11/3/2016
这应该是公认的答案imo。我同意@Skyr的评论作为答案
3赞 Florian Heigl 5/1/2017
ACK,这很好,不需要本地个人密钥环等,确实显示密钥名称...效果最好。
1赞 Tino 3/25/2019
由于某种未知/未记录的原因,抑制了我身边的指纹打印。Ubuntu 18.04gpg --with-fingerprintgpg (GnuPG) 2.1.18
0赞 kjones 4/12/2019
@Tino我也发生了同样的事情,你有没有找到任何关于为什么的其他信息?
1赞 joharr 10/23/2021
在 Arch 上,产生相同的输出,但没有“WARNING...”@JensErat提到。gpg --show-keys <keyfile>
2赞 Heye 5/10/2017 #5

当我偶然发现这个答案时,我正在寻找一种方法来获得易于解析的输出。对我来说,这个选项起到了作用:--with-colons

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

文档可以在这里找到。

评论

1赞 MKesper 4/2/2019
你如何获得漂亮的 YYYY-MM-DD 输出?我无法使用 gpg2.x 和 --with-colons 重现它。
1赞 user4466350 5/24/2019 #6

pgpdump (https://www.lirnberger.com/tools/pgpdump/)是可用于检查 PGP 块的工具。

然而,它对用户不友好,而且相当技术性,

  • 它解析公钥或私钥(无警告)
  • 它不会修改任何密钥环(根据我的经验,有时不太清楚 GPG 在引擎盖后面做了什么)
  • 它打印所有数据包,特别是 userid 的数据包,它显示有关密钥的各种文本数据。
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 : /

评论

0赞 rickhg12hs 3/8/2020
我的读物.例如,工作正常。pgpdumpstdincurl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdump
10赞 Paweł 7/16/2019 #7

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

$ 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 <[email protected]>                      │                     When  using --refresh-keys, if the key in question has a preferred keyserver URL, then use that
sub   elg2048/D43F1AF8 2008-01-08 [E]
5赞 pts 4/30/2020 #8

要获取密钥 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 中,它只打印一个短的(4 字节,8 个十六进制数字)密钥 ID,因此识别密钥的安全性较低。

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

3赞 justsomeguy 1/16/2023 #9

对于较新版本的 gngpg 版本 2.2.8 及更高版本:

如果您只想获取密钥的指纹或指纹而不导入密钥,也不想将 stderr 重定向到 stdout:
(即当您有脚本在继续之前验证指纹时,就像使用 ansible 一样)
2>&1


我包含了一种方法,一种不依赖于您的脚本偏好。--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'