Jak wyświetlić szczegóły klucza gpg bez importowania go?

131

Mam kopię klucza gpg repozytorium postgresql apt repository i chciałbym zobaczyć szczegóły klucza gpg w postaci, w jakiej znajduje się w pliku. Czy jest to możliwe bez importowania go do pęku kluczy?

Amos Shapira
źródło

Odpowiedzi:

149

Istnieje kilka poziomów szczegółowości, które można uzyskać, patrząc na kluczowe dane OpenPGP: podstawowe podsumowanie, dane wyjściowe tego podsumowania do odczytu maszynowego lub szczegółowa (i bardzo techniczna) lista poszczególnych pakietów OpenPGP.

Podstawowe kluczowe informacje

Aby uzyskać krótki przegląd pliku klucza OpenPGP, możesz po prostu przekazać nazwę pliku jako parametr lub potok w danych klucza przez STDIN. Jeśli żadne polecenie nie zostanie przekazane, GnuPG spróbuje odgadnąć, co chcesz zrobić - a dla kluczowych danych jest to wydrukowanie podsumowania klucza:

$ 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]

Po ustawieniu --keyid-format 0xlongdługie identyfikatory kluczy są drukowane zamiast niezabezpieczonych krótkich identyfikatorów kluczy :

$ 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]

Dostarcza -vlub -vvnawet doda więcej informacji. W tym przypadku wolę jednak wydrukować szczegóły paczki (patrz poniżej).

Wyjście do odczytu maszynowego

GnuPG ma również format wyjściowy rozdzielany dwukropkami, który można łatwo przeanalizować i ma stabilny format. Format jest udokumentowane w GnuPG doc/DETAILSpliku . Opcja otrzymania tego formatu to --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:::

Od GnuPG 2.1.23 gpg: WARNING: no command supplied. Trying to guess what you mean ...ostrzeżenie można pominąć, używając --import-options show-onlyopcji razem z --importpoleceniem (działa to --with-colonsoczywiście również bez ):

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

W przypadku starszych wersji: komunikat ostrzegawczy jest drukowany na STDERR, więc możesz po prostu przeczytać STDIN, aby oddzielić kluczowe informacje od ostrzeżenia.

Szczegóły techniczne: wyświetlanie pakietów OpenPGP

Bez instalowania dalszych pakietów możesz użyć gpg --list-packets [file]do przeglądania informacji o pakietach OpenPGP zawartych w pliku.

$ 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]Narzędzie działa podobnie jak gpg --list-packetsi zapewnia podobną moc, ale rozwiązuje wszystkie te identyfikatory algorytm czytelnych przedstawień. Jest dostępny dla prawdopodobnie wszystkich odpowiednich dystrybucji (w przypadku pochodnych Debiana pakiet jest nazywany pgpdumpjak samo narzędzie).

$ 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]
Jens Erat
źródło
1
Dzięki. Właśnie użyłem "gpg --list-keys path-to-key-file" i otrzymałem to, co chciałem zobaczyć: ... zaszyfrowany subpkt 2 len 4 (utworzony sig 2013-02-24) zaszyfrowany subpkt 9 len 4 (klucz wygasa po 4y134d23h24m) ... a pgpdump sprawia, że ​​wyjście jest trochę bardziej czytelne.
Amos Shapira
@AmosShapira Czy na pewno? To polecenie w ogóle na mnie nie działa. Może miałeś na myśli --list-packets?
Jonathan Cross
1
@JonathanCross Rzeczywiście, opisane wyjście brzmi jak --list-packets.
Jens Erat
1
Jak pozbyć się tego brzydkiego WARNING: no command suppliedna stderr? (To udaremnia używanie gpgw skryptach. Jeśli chodzi o kryptowaluty, jedynym bezpiecznym sposobem jest traktowanie dowolnego wyjścia na stderr jako błędu krytycznego. Tylko w ten sposób będziesz przygotowany, gdy zostaną odkryte nowe ważne słabości, które drukują tylko na stderr).
Tino
1
Nie jestem świadomy, że istnieje łatwy sposób. Nadal możesz użyć pliku klucza jako pliku kluczy, a następnie uruchomić --list-keys, coś w stylu gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. Lub po prostu odrzuć komunikat ostrzegawczy, istnieje kilka opcji filtrowania stderr w skryptach (ba) sh .
Jens Erat
31

Wydaje mi się, że radzę sobie po prostu z:

$gpg <path_to_file>

Które wyjścia są takie:

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

Operacja nie określiła w szczególności, jakie kluczowe informacje są istotne. To jest wszystko, na czym mi zależy.

Therealstubot
źródło
30

Aby zweryfikować i wyświetlić odcisk palca klucza (bez wcześniejszego importowania go do pęku kluczy), wpisz

gpg --with-fingerprint <filename>

Edycja: w systemie Ubuntu 18.04 (gpg 2.2.4) odcisk palca nie jest wyświetlany przy użyciu powyższego polecenia. --with-subkey-fingerprintZamiast tego użyj opcji

gpg --with-subkey-fingerprint <filename>
Ronny Andersson
źródło
4
To powinna być akceptowana odpowiedź imo. Zgadzam się z komentarzem opublikowanym jako odpowiedź przez @Skyr.
gertvdijk
2
ACK, to jest bardzo dobre, nie wymaga lokalnego klucza osobistego itp. Wyświetla nazwę klucza ... działa najlepiej.
Florian Heigl
1
Z jakiegoś nieznanego / nieudokumentowanego powodu gpg --with-fingerprintuniemożliwia drukowanie odcisków palców po mojej stronie. Ubuntu 18.04gpg (GnuPG) 2.1.18
Tino
To samo dzieje się ze mną @Tino, czy znalazłeś jakieś dodatkowe informacje o tym, dlaczego?
kjones
@Tino i @kjones Zaktualizowali odpowiedź, dodając --with-subkey-fingerprintinformacje, które powinny działać na Ubuntu 18.04
Ronny Andersson
9

Opcja --list-packets analizuje dane pgp z pliku i wyświetla jego strukturę - jednak w bardzo techniczny sposób. Podczas analizowania klucza publicznego można łatwo wyodrębnić identyfikatory użytkowników i identyfikatory kluczy podpisów.

Uważaj, ponieważ to polecenie analizuje tylko format danych, nie sprawdza poprawności podpisów ani podobnych rzeczy.

Skyr
źródło
2

Kiedy natknąłem się na tę odpowiedź, szukałem sposobu na uzyskanie wyniku, który będzie łatwy do przeanalizowania. U mnie opcja --with-colonszałatwiła sprawę:

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

Dokumentację można znaleźć tutaj .

Hej
źródło
Jak uzyskać to ładne wyjście RRRR-MM-DD? Nie mogę tego odtworzyć za pomocą gpg2.x i --with-colons.
MKesper
1

Możesz także użyć --keyid-formatprzełącznika, aby wyświetlić krótki lub długi identyfikator klucza:

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

który wyświetla w ten sposób (przykład z klucza repozytorium 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]
Paweł
źródło
0

pgpdump( https://www.lirnberger.com/tools/pgpdump/ ) to narzędzie, którego można użyć do inspekcji bloków pgp.

Nie jest jednak przyjazny dla użytkownika i dość techniczny,

  • analizuje klucze publiczne lub prywatne (bez ostrzeżenia)
  • nie modyfikuje żadnego breloczka (czasami nie jest tak jasne, co robi gpg za maską, z mojego doświadczenia)
  • wypisuje wszystkie pakiety, w szczególności pakiety identyfikatorów użytkowników, które pokazują różne dane tekstowe dotyczące kluczy.
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

niestety nie czyta stdin: /

mh-cbon
źródło
Moje pgpdumpczytania stdin. Np. curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdumpDziała dobrze.
rickhg12hs
0

Aby uzyskać identyfikatory kluczy (8 bajtów, 16 cyfr szesnastkowych), jest to polecenie, które działało dla mnie w GPG 1.4.16, 2.1.18 i 2.2.19:

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

Aby uzyskać więcej informacji (oprócz identyfikatora klucza):

gpg --list-packets <key.asc

Aby uzyskać jeszcze więcej informacji:

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

Komenda

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

działa również we wszystkich 3 wersjach, ale w GPG 1.4.16 drukuje tylko krótki (4 bajty, 8 cyfr szesnastkowych) identyfikator klucza, więc identyfikacja kluczy jest mniej bezpieczna.

Niektóre polecenia w innych odpowiedzi (np gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) nie działają w niektórych wersjach GPG 3 powyżej, a tym samym nie są przenośne podczas kierowania wieloma wersjami GPG.

pkt
źródło