ssh-add -l
Zeigt 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 -l
Zeigt 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-agent
Funktion, mit der private Schlüssel tatsächlich zwischengespeichert werden, gpg-agent
entweder Schlüssel oder Passphrasen zwischengespeichert werden. Es ist für jeden Kunden auf , die in dem Cache, und gpg
nur verwenden gpg-agent
das Passwort cachen.
Sie können mit gpg-agent
dem gpg-connect-agent
Dienstprogramm 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-agent
und Übergeben dieses Befehls pinentry
fordert 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_PASSPHRASE
um gpg-agent
wieder mit dem gleichen $CACHEID
, gibt es die anstelle von Passwort zwischengespeichert pinentry
.
GET_PASSPHRASE
Akzeptiert auch eine --no-ask
Option, 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-agent
die 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 OK
oder ERR
in der Ausgabe suchen. Es stellt sich dann die Frage, wie ich die Cache-ID generiere. Wie wir im obigen Beispiel sehen, gpg-agent
ist liberal, was es als Cache-ID akzeptiert. Es stellt sich heraus, dass gpg
ein 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_PASSPHRASE
enthält tatsächlich die Passphrase im Klartext . Auch wenn Sie die --data
Option 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-agent
Ruft die pinentry
Programmvariante auf, für die es konfiguriert ist. Siehe zum Beispiel Wie GPG erzwingen Verwendung Konsolenmodus pinentry ... .
gpg-2.1.11
von Quelle auf 14,04 Ubuntu kompiliert, kann ich nicht herausfinden , was die gpg-agent
Cache - 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-agent
berichtet 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_TTY
ist 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 --list
mit aufzulisten gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
Die 1
in 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 --fingerprint
zweimal 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
.
--fingerprint
gegen zwei --fingerprint --fingerprint
geben 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