Wie kann ich herausfinden, welche Schlüssel gpg-agent zwischengespeichert hat? (wie ssh-add -l zeigt Ihnen zwischengespeicherte SSH-Schlüssel)

40

ssh-add -lZeigt alle ssh-Schlüssel an, die mit hinzugefügt wurden ssh-add ~/.ssh/id_yourkey. Wie mache ich das Analoge mit gpg und gpg-agent, mit anderen Worten, bitte es, eine Liste von zwischengespeicherten Schlüsseln anzuzeigen?

user3243135
quelle

Antworten:

32

Möglicherweise können Sie dies nicht, zumindest noch nicht oder zumindest nicht im allgemeinen Fall. Ich werde jedoch mitteilen, was ich gelernt habe, und freue mich darauf, diese Antwort zu gegebener Zeit zu aktualisieren.

Erstens können im Gegensatz zu der ssh-agentFunktion, mit der private Schlüssel tatsächlich zwischengespeichert werden, gpg-agententweder Schlüssel oder Passphrasen zwischengespeichert werden. Es ist für jeden Kunden auf , die in dem Cache, und gpgnur verwenden gpg-agentdas Passwort cachen.

Sie können mit gpg-agentdem gpg-connect-agentDienstprogramm interagieren . Im folgenden Beispiel übergebe ich Befehle einzeln über STDIN.

$ CACHEID="ThisIsTheTrickyPart"
$ ERRSTR="Error+string+goes+here"
$ PMTSTR="Prompt"
$ DESSTR="Description+string+goes+here"
$ echo "GET_PASSPHRASE --data $CACHEID $ERRSTR $PMTSTR $DESSTR" | gpg-connect-agent
D MyPassPhrase
OK

Beim Aufrufen gpg-connect-agentund Übergeben dieses Befehls pinentryfordert der auf meinem System konfigurierte Befehl mit den Zeichenfolgen error, prompt und description zur Eingabe einer Passphrase auf. In diesem Fall habe ich "MyPassPhrase" eingegeben, was in der strukturierten Ausgabe zurückgegeben wird (siehe Abbildung unten) . Wenn ich sende , GET_PASSPHRASEum gpg-agentwieder mit dem gleichen $CACHEID, gibt es die anstelle von Passwort zwischengespeichert pinentry.

                                 ss des Dialogfelds

GET_PASSPHRASEAkzeptiert auch eine --no-askOption, die einen Fehler bei einem Cache-Miss zurückgibt. Hier verwende ich "NotCachedID" als Cache-ID und verwende Dummy-Strings für die erforderlichen Argumente, gpg-agentdie nicht verwendet werden.

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

Im Prinzip könnten Sie den Agenten dann nacheinander nach jeder möglicherweise zwischengespeicherten Passphrase fragen und nach OKoder ERRin der Ausgabe suchen. Es stellt sich dann die Frage, wie ich die Cache-ID generiere. Wie wir im obigen Beispiel sehen, gpg-agentist liberal, was es als Cache-ID akzeptiert. Es stellt sich heraus, dass gpgein Fingerabdruck auf dem öffentlichen Schlüssel berechnet und eine hexadezimal codierte Zeichenfolgendarstellung als Cache-ID verwendet wird. Das Problem ist jedoch, dass dieser Fingerabdruck nicht mit dem Fingerabdruck identisch ist, den Sie über lernen könnengpg --fingerprint --list-secret-keys. Dieser Digest wird als Keygrip bezeichnet (da er nur über das Rohschlüsselmaterial berechnet wird, während der Fingerabdruck über das Schlüsselmaterial und den Erstellungszeitstempel berechnet wird). Wenn Sie diesen Weg wirklich fortsetzen möchten, müssen Sie herausfinden, wie Sie den richtigen Fingerabdruck für jeden der zu überprüfenden Schlüssel generieren können (dies wird mit der nächsten Generation von GnuPG 2.1 mit der Option einfach sein --with-keygrip).

Warnung: Die Ausgabe von GET_PASSPHRASEenthält tatsächlich die Passphrase im Klartext . Auch wenn Sie die --dataOption weglassen, wird die Passphrase deutlich als hexadezimal codierte Zeichenfolge angezeigt. Es ist wahrscheinlich eine sehr schlechte Idee, sich damit zu beschäftigen, es sei denn, Sie wissen, was Sie tun, und treffen die entsprechenden Vorsichtsmaßnahmen.

neirbowj
quelle
Tolle Antwort! Ich habe tagelang gesucht und konnte nicht viel dazu finden. So fassen Sie alles zusammen und erklären es klar und prägnant!
SLM
Der Screenshot ist keine Eingabe, sondern ein GNOME-Programm, das abfängt gpg-agent, oder?
Hauke ​​Laging
gpg-agentRuft die pinentryProgrammvariante auf, für die es konfiguriert ist. Siehe zum Beispiel Wie GPG erzwingen Verwendung Konsolenmodus pinentry ... .
Neirbowj
Unter Verwendung gpg-2.1.11von Quelle auf 14,04 Ubuntu kompiliert, kann ich nicht herausfinden , was die gpg-agentCache - ID ist: ich beide keygrips versucht (Hauptschlüssel und Unterschlüssel) und den Schlüssel Fingerabdruck, wie dargestellt durch gpg --fingerprint --with-keygrip <user>. Keiner von ihnen funktioniert und gpg-connect-agentberichtet immer ERR 67108922 No data <GPG Agent>. Ich habe überprüft, ob der Agent die Passphrase noch hat, indem er GPG_TTY= gpg --decrypt <file>nach dem Ausprobieren verschiedener Cache-IDs erfolgreich ausgeführt wurde . (Falls es durch Deaktivieren unklar ist, GPG_TTYist die Entschlüsselung nur dann erfolgreich, wenn die Passphrase bereits von zwischengespeichert wurde gpg-agent.)
Matei David,
Könnte 2.0.14 fehlerhaft sein? Mit der oben beschriebenen Methode hat gpg-agent zwar die gewünschte Passphrase für den angegebenen Schlüssel (identifiziert durch den Schlüsselgriff), aber wenn ich versuche, mit diesem Schlüsselgriff zu signieren, werde ich dennoch zur Eingabe eines Passworts aufgefordert. Warum?
Otheus
8

In späteren Versionen von gnupg (getestet mit 2.1.18) verwenden Sie:

gpg --fingerprint --with-keygrip <email>

um den Schlüsselgriff zu bekommen

echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent

um zu sehen, ob es zwischengespeichert ist oder nicht.

gimmesudo
quelle
5

In späteren Versionen von GnuPG (getestet mit 2.2.9) ist es auch möglich, die Keygrips, die derzeit vom Agenten zwischengespeichert werden, mit dem Befehl keyinfo --listmit aufzulisten gpg-connect-agent.

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK

Die 1in der siebten Spalte gibt an, dass der Schlüsselgriff zwischengespeichert ist. Die Zuordnung zwischen einem Schlüsselgriff und dem Schlüssel, den er darstellt, kann mit abgerufen werden gpg --list-secret-keys --with-keygrip.

Quelle: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/

GeoffreyFrogeye
quelle
3

Um die Cache-ID zu erhalten, müssen Sie Folgendes --fingerprintzweimal erwähnen :

$ gpg --fingerprint --fingerprint [email protected]
pub   1024D/517D0F0E 2000-10-10
      Key fingerprint = C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
uid                  Linux Kernel Archives Verification Key <[email protected]>
sub   4096g/E50A8F2A 2000-10-10
      Key fingerprint = E851 4C25 10C6 0291 0D47  A008 7C8B 4360 E50A 8F2A

Die cacheid wäre in diesem Fall E8514C2510C602910D47A0087C8B4360E50A8F2A.

Ed Neville
quelle
Das hat bei mir funktioniert
Matthew Hannigan
Die Antwort unter unix.stackexchange.com/a/342461/108198 scheint besser zu sein.
Ben Creasy
Das funktioniert bei mir nicht ... eins --fingerprintgegen zwei --fingerprint --fingerprintgeben genau die gleiche Ausgabe zurück. Wie @BenCreasy schreibt, funktioniert die obige Antwort mit dem Schlüsselgriff.
Trey