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?
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?
Antworten:
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.

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.
gpg-agent, oder?
gpg-agentRuft die pinentryProgrammvariante auf, für die es konfiguriert ist. Siehe zum Beispiel Wie GPG erzwingen Verwendung Konsolenmodus pinentry ... .
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.)
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/
Um die Cache-ID zu erhalten, müssen Sie Folgendes --fingerprintzweimal erwähnen :
$ gpg --fingerprint --fingerprint ftpadmin@kernel.org
pub 1024D/517D0F0E 2000-10-10
Key fingerprint = C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E
uid Linux Kernel Archives Verification Key <ftpadmin@kernel.org>
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.
--fingerprintgegen zwei --fingerprint --fingerprintgeben genau die gleiche Ausgabe zurück. Wie @BenCreasy schreibt, funktioniert die obige Antwort mit dem Schlüsselgriff.
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Die Cache-ID ist der vollständige Fingerabdruck des Schlüssels.
gpg --fingerprint user@foo.bar