Wie kann man GPG-Schlüsseldetails anzeigen, ohne sie zu importieren?

130

Ich habe eine Kopie des GPG-Schlüssels für das Postgresql-Apt-Repository und möchte die Details des GPG-Schlüssels so anzeigen, wie er in der Datei enthalten ist. Ist dies möglich, ohne es in einen Schlüsselring zu importieren?

Amos Shapira
quelle

Antworten:

148

Es gibt verschiedene Detailebenen, die Sie beim Betrachten von OpenPGP-Schlüsseldaten erhalten können: eine grundlegende Zusammenfassung, eine maschinenlesbare Ausgabe dieser Zusammenfassung oder eine detaillierte (und sehr technische) Liste der einzelnen OpenPGP-Pakete.

Grundlegende Schlüsselinformationen

Für einen kurzen Überblick über eine OpenPGP-Schlüsseldatei können Sie den Dateinamen einfach als Parameter oder Pipe in den Schlüsseldaten über STDIN übergeben. Wenn kein Befehl übergeben wird, versucht GnuPG zu erraten, was Sie tun möchten. Bei Schlüsseldaten wird eine Zusammenfassung auf den Schlüssel gedruckt:

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

Durch Festlegen --keyid-format 0xlongwerden lange Schlüssel-IDs anstelle der unsicheren kurzen Schlüssel-IDs gedruckt :

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

Bereitstellung -voder -vvHinzufügen weiterer Informationen. In diesem Fall drucke ich jedoch lieber die Paketdetails (siehe unten).

Maschinenlesbare Ausgabe

GnuPG hat auch ein durch Doppelpunkte getrenntes Ausgabeformat, das leicht zu analysieren ist und ein stabiles Format hat. Das Format ist in der GnuPG- doc/DETAILSDatei dokumentiert . Die Option, dieses Format zu erhalten, ist --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:::

Seit GnuPG 2.1.23 kann die gpg: WARNING: no command supplied. Trying to guess what you mean ...Warnung weggelassen werden, indem die --import-options show-onlyOption zusammen mit dem verwendet wird--import Befehl verwendet wird (dies funktioniert --with-colonsnatürlich auch ohne ):

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

Für ältere Versionen: Die Warnmeldung wird auf STDERR gedruckt, sodass Sie einfach STDIN lesen können, um die wichtigsten Informationen von der Warnung zu trennen.

Technische Details: Auflisten von OpenPGP-Paketen

Ohne weitere Pakete zu installieren, können Sie gpg --list-packets [file]Informationen zu den in der Datei enthaltenen OpenPGP-Paketen anzeigen.

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

Das pgpdump [file]Tool funktioniert ähnlich gpg --list-packetsund liefert eine ähnliche Ausgabe, löst jedoch alle diese Algorithmus-IDs in lesbare Darstellungen auf. Es ist für wahrscheinlich alle relevanten Distributionen verfügbar (bei Debian-Derivaten wird das Paket pgpdumpwie das Tool selbst aufgerufen ).

$ 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
quelle
1
Vielen Dank. Ich habe gerade "gpg --list-keys path-to-key-file" verwendet und habe bekommen, was ich sehen wollte: ... hashed subpkt 2 len 4 (sig erstellt am 24.02.2013) hashed subpkt 9 len 4 (key läuft nach 4y134d23h24m ab) ... und pgpdump macht die Ausgabe etwas lesbarer.
Amos Shapira
@AmosShapira Bist du sicher? Dieser Befehl funktioniert bei mir überhaupt nicht. Vielleicht hast du gemeint --list-packets?
Jonathan Cross
1
@ JonathanCross In der Tat klingt die beschriebene Ausgabe wie --list-packets.
Jens Erat
1
Wie kann man dieses hässliche WARNING: no command suppliedzu stderr loswerden ? (Dies verhindert die gpgordnungsgemäße Verwendung in Skripten. Wenn es um Krypto geht, besteht die einzig sichere Möglichkeit darin, die Ausgabe an stderr als schwerwiegenden Fehler zu behandeln. Nur so werden Sie vorbereitet, wenn neue wichtige Schwachstellen entdeckt werden, die nur an stderr gedruckt werden.)
Tino
1
Mir ist nicht bewusst, dass es einen einfachen Weg gibt. Sie können die Schlüsseldatei dennoch als Schlüsselbund verwenden und dann ausführen --list-keys, so etwas wie gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. Oder verwerfen Sie einfach die Warnmeldung. Es gibt eine Reihe von Optionen zum Filtern von stderr in (ba) sh-Skripten .
Jens Erat
31

Ich scheine einfach zurechtzukommen:

$gpg <path_to_file>

Welche Ausgänge wie folgt:

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

Die Operation hat nicht speziell angegeben, welche Schlüsselinformationen relevant sind. Diese Ausgabe ist alles, was mich interessiert.

Therealstubot
quelle
30

Geben Sie Folgendes ein, um den Fingerabdruck des Schlüssels zu überprüfen und aufzulisten (ohne ihn zuerst in den Schlüsselring zu importieren)

gpg --with-fingerprint <filename>

Bearbeiten: Unter Ubuntu 18.04 (gpg 2.2.4) wird der Fingerabdruck mit dem obigen Befehl nicht angezeigt. Verwenden Sie --with-subkey-fingerprintstattdessen die Option

gpg --with-subkey-fingerprint <filename>
Ronny Andersson
quelle
4
Dies sollte die akzeptierte Antwort sein. Ich stimme dem Kommentar zu, den @Skyr als Antwort gepostet hat.
Gertvdijk
2
ACK, das ist sehr gut, erfordert keinen lokalen persönlichen Schlüsselring usw. zeigt den Schlüsselnamen an ... funktioniert am besten.
Florian Heigl
1
Aus einem unbekannten / undokumentierten Grund wird gpg --with-fingerprintdas Drucken von Fingerabdrücken an meiner Seite unterdrückt. Ubuntu 18.04gpg (GnuPG) 2.1.18
Tino
Das Gleiche passiert auch für mich @Tino. Hast du zusätzliche Informationen darüber gefunden, warum?
Kjones
@Tino und @kjones Aktualisierte die Antwort mit --with-subkey-fingerprintInformationen, die unter Ubuntu 18.04 funktionieren sollten
Ronny Andersson
9

Die Option --list-packetsanalysiert pgp-Daten aus einer Datei und gibt ihre Struktur aus - allerdings auf sehr technische Weise. Beim Parsen eines öffentlichen Schlüssels können Sie die Benutzer-IDs und die Schlüssel-IDs der Signaturen einfach extrahieren.

Seien Sie vorsichtig, dass dieser Befehl nur das Datenformat analysiert und keine Signaturen oder ähnliche Dinge überprüft.

Skyr
quelle
2

Als ich über diese Antwort stolperte, suchte ich nach einer Möglichkeit, eine Ausgabe zu erhalten, die leicht zu analysieren ist. Für mich hat die Option --with-colonsden Trick getan:

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

Dokumentation finden Sie hier .

Heye
quelle
Wie bekommt man diese schöne JJJJ-MM-TT-Ausgabe? Ich kann das mit gpg2.x und --with-colons nicht reproduzieren.
MKesper
1

Sie können auch den --keyid-formatSchalter verwenden, um die kurze oder lange Schlüssel-ID anzuzeigen:

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

welche Ausgaben wie folgt (Beispiel von PostgreSQL CentOS Repo-Schlüssel):

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ł
quelle
0

pgpdump( https://www.lirnberger.com/tools/pgpdump/ ) ist ein Tool, mit dem Sie pgp-Blöcke überprüfen können.

Es ist jedoch nicht benutzerfreundlich und ziemlich technisch

  • es analysiert öffentliche oder private Schlüssel (ohne Vorwarnung)
  • es ändert keinen Schlüsselring (manchmal ist es meiner Erfahrung nach nicht so klar, was gpg hinter der Haube macht)
  • Es werden alle Pakete gedruckt, insbesondere die Pakete der Benutzer-ID, in denen die verschiedenen Textdaten zu den Schlüsseln angezeigt werden.
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

leider liest es nicht stdin: /

mh-cbon
quelle
Mein pgpdumpliest stdin. ZB curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdumpfunktioniert gut.
Rickhg12hs
0

Um die Schlüssel-IDs (8 Bytes, 16 hexadezimale Ziffern) zu erhalten, ist dies der Befehl, der in GPG 1.4.16, 2.1.18 und 2.2.19 für mich funktioniert hat:

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

So erhalten Sie weitere Informationen (zusätzlich zur Schlüssel-ID):

gpg --list-packets <key.asc

Um noch mehr Informationen zu erhalten:

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

Der Befehl

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

funktioniert auch in allen 3 Versionen, aber in GPG 1.4.16 wird nur eine kurze Schlüssel-ID (4 Bytes, 8 Hexadezimalstellen) gedruckt, sodass die Identifizierung von Schlüsseln weniger sicher ist.

Einige Befehle in anderen Antworten (zB gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) funktioniert nicht in einige der 3 GPG - Versionen oben, so dass sie nicht tragbar sind , wenn mehrere Versionen von GPG - Targeting.

pts
quelle