【问题标题】:How to display gpg key details without importing it?如何在不导入的情况下显示 gpg 密钥详细信息?
【发布时间】:2014-03-03 01:10:44
【问题描述】:

我有一份 postgresql apt 存储库 gpg 密钥的副本,并希望查看文件中 gpg 密钥的详细信息。如果不将其导入密钥环,这可能吗?

【问题讨论】:

    标签: gnupg openpgp


    【解决方案1】:

    查看 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, long key IDs are printed 而不是insecure short key IDs

    $ 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 也有冒号分隔的输出格式,易于解析,格式稳定。 format is documented in GnuPG doc/DETAILS file。接收这种格式的选项是--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 开始,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] 工具的工作方式与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 --list-keys path-to-key-file”并得到了我想看到的内容: ... hashed subpkt 2 len 4 (sig created 2013-02-24) hashed subpkt 9 len 4 (key在 4y134d23h24m) 之后过期...并且 pgpdump 使输出更具可读性。
    • @JonathanCross 事实上,所描述的输出听起来像--list-packets
    • 如何摆脱这个丑陋的WARNING: no command supplied 到stderr? (这阻碍了在脚本中正确使用gpg。当涉及到加密时,唯一安全的方法是将任何输出到 stderr 视为致命错误。只有这样,当发现仅打印到 stderr 的新的重要弱点时,您才能做好准备) .
    • 我不知道有一个简单的方法。您仍然可以将密钥文件用作密钥环,然后运行--list-keys,类似于gpg --no-default-keyring --keyring=/tmp/&lt;keyfile&gt; --list-keys。或者干脆丢弃警告信息,有a bunch of options to filter stderr in (ba)sh scripts
    • --import-options show-only --import 的替代品是--show-keys,它似乎是在 2019 年初左右添加的[编辑:~2.2.12-13 区域,没有深入研究变更日志]。 (在@Pawel 's answer中也提到过)
    【解决方案2】:

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

    gpg --with-fingerprint <filename>
    

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

    gpg --with-subkey-fingerprint <filename>
    

    【讨论】:

    • 这应该是 imo 接受的答案。我同意@Skyr 的comment-posted-as-answer
    • ACK,这很好,不需要本地个人密钥环等。确实显示密钥名称......效果最好。
    • 由于某些未知/未记录的原因gpg --with-fingerprint 禁止在我身边打印指纹。 Ubuntu 18.04 gpg (GnuPG) 2.1.18
    • 我也发生了同样的事情@Tino,您是否找到任何有关原因的其他信息?
    • @Tino 和@kjones 用--with-subkey-fingerprint 更新了答案,应该可以在 Ubuntu 18.04 上运行
    【解决方案3】:

    我似乎可以简单地相处:

    $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
    

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

    【讨论】:

      【解决方案4】:

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

      请注意此命令解析数据格式,它不会验证签名或类似的事情。

      【讨论】:

        【解决方案5】:

        您也可以使用--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]
        

        【讨论】:

          【解决方案6】:

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

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

          可以在here找到文档。

          【讨论】:

          • 你如何得到漂亮的 YYYY-MM-DD 输出?我无法用 gpg2.x 和 --with-colons 重现它。
          【解决方案7】:

          要获取密钥 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,因此识别密钥的安全性较低。

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

          【讨论】:

            【解决方案8】:

            pgpdump (https://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
            

            不幸的是它不读取标准输入:/

            【讨论】:

            • 我的pgpdump 读作stdin。例如,curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdump 工作正常。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多