Как отобразить информацию о ключе gpg без его импорта?

У меня есть копия ключа gpg репозитория postgresql apt, и я хотел бы просмотреть сведения о ключе gpg в том виде, в каком он содержится в файле. Возможно ли это без импорта в связку ключей?


person Amos Shapira    schedule 03.03.2014    source источник


Ответы (8)


Есть несколько уровней детализации, которые вы можете получить при просмотре ключевых данных 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 длинные идентификаторы ключей печатаются вместо небезопасные идентификаторы коротких ключей:

$ 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] работает так же, как 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]
person Jens Erat    schedule 03.03.2014
comment
Спасибо. Я просто использовал gpg --list-keys path-to-key-file и получил то, что хотел увидеть: ... hashed subpkt 2 len 4 (sig создан 2013-02-24) hashed subpkt 9 len 4 (срок действия ключа истекает после 4y134d23h24m) ... и pgpdump делает вывод более читабельным. - person Amos Shapira; 05.03.2014
comment
@AmosShapira Ты уверен? У меня эта команда вообще не работает. Возможно, вы имели в виду --list-packets ? - person Jonathan Cross; 01.12.2018
comment
@JonathanCross Действительно, описанный вывод звучит как --list-packets. - person Jens Erat; 02.12.2018
comment
Как избавиться от этого уродливого WARNING: no command supplied в stderr? (Это препятствует правильному использованию gpg в сценариях. Когда дело доходит до криптографии, единственный безопасный способ — рассматривать любой вывод в stderr как фатальную ошибку. Только так вы будете готовы к обнаружению новых важных уязвимостей, которые печатаются только в stderr). - person Tino; 24.03.2019
comment
Я не знаю, есть ли простой способ обойти это. Вы все еще можете использовать файл ключа в качестве набора ключей, а затем запустить --list-keys, что-то вроде gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. Или просто откажитесь от предупреждающего сообщения, есть множество опций для фильтрации stderr в сценариях (ba)sh. - person Jens Erat; 25.03.2019
comment
Альтернативой --import-options show-only --import является --show-keys, который, кажется, был добавлен примерно в начале 2019 года [править: область ~2.2.12-13, не углубляясь в журналы изменений]. (также упоминается в @Pawel answer) - person mjbnz; 09.02.2021

Чтобы проверить и перечислить отпечаток ключа (без предварительного импорта его в связку ключей), введите

gpg --with-fingerprint <filename>

Изменить: в Ubuntu 18.04 (gpg 2.2.4) отпечаток пальца не отображается с помощью приведенной выше команды. Вместо этого используйте параметр --with-subkey-fingerprint

gpg --with-subkey-fingerprint <filename>
person Ronny Andersson    schedule 08.03.2016
comment
Это должен быть принятый ответ imo. Я согласен с комментарием, опубликованным как ответ @Skyr. - person gertvdijk; 03.11.2016
comment
ACK, это очень хорошо, не требует локального персонального набора ключей и т. д., отображает имя ключа... работает лучше всего. - person Florian Heigl; 30.04.2017
comment
По какой-то неизвестной/недокументированной причине gpg --with-fingerprint подавляет печать отпечатков пальцев на моей стороне. Убунту 18.04 gpg (GnuPG) 2.1.18 - person Tino; 24.03.2019
comment
То же самое происходит и со мной @Tino, вы нашли дополнительную информацию о том, почему? - person kjones; 12.04.2019
comment
@Tino и @kjones Обновлен ответ с информацией --with-subkey-fingerprint, которая должна работать в Ubuntu 18.04. - person Ronny Andersson; 29.07.2019

Я, кажется, могу ладить с просто:

$gpg <path_to_file>

Что выводит так:

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

Оператор не указал, в частности, какая ключевая информация актуальна. Этот результат - все, что меня волнует.

person Therealstubot    schedule 04.12.2014

Опция --list-packets анализирует данные pgp из файла и выводит их структуру, однако очень техническим способом. При анализе открытого ключа вы можете легко извлечь идентификаторы пользователей и идентификаторы ключей подписей.

Имейте в виду, что эта команда только анализирует формат данных, она не проверяет подписи или подобные вещи.

person Skyr    schedule 03.03.2014

Вы также можете использовать переключатель --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]
person Paweł    schedule 16.07.2019

Когда я наткнулся на этот ответ, я искал способ получить вывод, который легко анализировать. Для меня вариант --with-colons помог:

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

Документацию можно найти здесь.

person Heye    schedule 10.05.2017
comment
Как вы получаете этот хороший вывод YYYY-MM-DD? Я не могу воспроизвести это с помощью gpg2.x и --with-colons. - person MKesper; 02.04.2019

Чтобы получить идентификаторы ключей (8 байт, 16 шестнадцатеричных цифр), это команда, которая работала для меня в GPG 1.4.16, 2.1.18 и 2.2.19:

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

Чтобы получить дополнительную информацию (помимо идентификатора ключа):

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 шестнадцатеричных цифр) идентификатор ключа, поэтому идентифицировать ключи менее безопасно.

Некоторые команды в других ответах (например, gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) не работают в некоторых из 3 версий GPG выше, поэтому они не переносимы при работе с несколькими версиями GPG.

person pts    schedule 30.04.2020

pgpdump (https://www.lirnberger.com/tools/pgpdump/) — это инструмент, который вы можете использовать для проверки блоков pgp.

Однако это не удобно для пользователя и довольно технично,

  • он анализирует открытые или закрытые ключи (без предупреждения)
  • он не изменяет связку ключей (по моему опыту, иногда не так ясно, что 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

к сожалению, он не читает стандартный ввод: /

person mh-cbon    schedule 23.05.2019
comment
Мой pgpdump читается как stdin. Например, curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdump работает нормально. - person rickhg12hs; 08.03.2020