ssh-add -l
pokazuje wszystkie klucze ssh, które zostały dodane za pomocą ssh-add ~/.ssh/id_yourkey
. Jak zrobić analogiczne działanie z gpg i gpg-agent, innymi słowy, poprosić go o wyświetlenie listy kluczy w pamięci podręcznej?
Możesz nie być w stanie tego zrobić, przynajmniej jeszcze nie, lub przynajmniej nie w ogólnym przypadku. Podzielę się jednak tym, czego się nauczyłem, i z niecierpliwością oczekuję aktualizacji tej odpowiedzi we właściwym czasie.
Przede wszystkim, w przeciwieństwie do ssh-agent
funkcji, która faktycznie buforuje klucze prywatne, gpg-agent
może buforować klucze lub hasła. To do każdego klienta należy buforowanie, a gpg
po prostu używa gpg-agent
do buforowania hasła.
Możesz gpg-agent
korzystać z tego gpg-connect-agent
narzędzia. W poniższym przykładzie przekazuję polecenia pojedynczo za pośrednictwem 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
Po wywołaniu gpg-connect-agent
i przekazaniu tego polecenia, pinentry
polecenie skonfigurowane w moim systemie używa ciągów błędów, monitów i opisów do monitowania o podanie hasła. W tym przypadku wpisałem „MyPassPhrase”, co jest zwracane w ustrukturyzowanym wyjściu (patrz obrazek poniżej) . Jeśli wyślę GET_PASSPHRASE
to gpg-agent
ponownie z tym samym $CACHEID
, zwróci buforowane hasło zamiast użycia pinentry
.
GET_PASSPHRASE
akceptuje również --no-ask
opcję, która zwróci błąd przy braku pamięci podręcznej. Tutaj używam „NotCachedID” jako identyfikatora pamięci podręcznej i używam fikcyjnych łańcuchów dla wymaganych argumentów, gpg-agent
które nie będą używane.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
Zasadniczo możesz więc poprosić agenta o każde hasło, które może być w pamięci podręcznej, po kolei i sprawdzić, OK
czy ERR
w danych wyjściowych. Powstaje pytanie, jak wygenerować identyfikator pamięci podręcznej? Jak widzimy w powyższym przykładzie, gpg-agent
jest liberalny w tym, co akceptuje jako identyfikator pamięci podręcznej. Okazuje się, że gpg
oblicza odcisk palca na kluczu publicznym i używa szesnastkowej reprezentacji łańcucha jako identyfikatora pamięci podręcznej, ale problem polega na tym, że ten odcisk palca nie jest taki sam jak odcisk palca, którego można się nauczyćgpg --fingerprint --list-secret-keys
. Ten skrót nazywa się keygrip (ponieważ jest obliczany tylko na podstawie surowego materiału klucza, podczas gdy odcisk palca jest obliczany na podstawie materiału klucza i znacznika czasu utworzenia). Jeśli naprawdę chcesz kontynuować tę ścieżkę, musisz dowiedzieć się, jak wygenerować prawidłowy odcisk palca dla każdego z klawiszy, które chcesz sprawdzić (będzie to łatwe dzięki nowej generacji GnuPG, 2.1, z opcją --with-keygrip
).
Ostrzeżenie: Dane wyjściowe GET_PASSPHRASE
faktycznie zawierają hasło w postaci niezaznaczonej . Nawet jeśli zrezygnujesz z tej --data
opcji, hasło jest wyraźnie widoczne jako ciąg znaków w kodzie szesnastkowym. Prawdopodobnie jest to bardzo zły pomysł (tm), jeśli nie wiesz, co robisz, i nie podejmiesz odpowiednich środków ostrożności.
gpg-agent
, prawda?gpg-agent
wywołuje dowolny smakpinentry
programu, z którego jest skonfigurowany. Patrz np Jak zmusić GPG do trybu konsoli stosowanie pineentry ... .gpg-2.1.11
z kompilacji ze źródła na Ubuntu 14.04, nie mogę zrozumieć, jakigpg-agent
jest identyfikator pamięci podręcznej: wypróbowałem zarówno keygrips (klucz główny i podklucz), jak i odcisk palca klucza, jak pokazano przezgpg --fingerprint --with-keygrip <user>
. Żadne z nich nie działa igpg-connect-agent
zawsze zgłaszaERR 67108922 No data <GPG Agent>
. Dokładnie sprawdziłem, czy agent nadal ma hasło, uruchamiając sięGPG_TTY= gpg --decrypt <file>
po wypróbowaniu różnych identyfikatorów pamięci podręcznej. (W przypadku niejasności dezaktywacja powodujeGPG_TTY
deszyfrowanie tylko wtedy, gdy hasło jest już w pamięci podręcznejgpg-agent
).W nowszych wersjach gnupg (testowanych z 2.1.18) użyj:
gpg --fingerprint --with-keygrip <email>
aby zdobyć klucz
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
aby sprawdzić, czy jest w pamięci podręcznej, czy nie.
źródło
W nowszych wersjach GnuPG (testowanych w wersji 2.2.9) można również wyświetlić listę klawiszy, które są obecnie buforowane przez agenta za pomocą polecenia
keyinfo --list
zgpg-connect-agent
.1
W siódmej kolumnie wskazuje, że keygrip jest buforowane. Powiązanie między uchwytem klucza a kluczem, który reprezentuje, można odzyskaćgpg --list-secret-keys --with-keygrip
.Źródło: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
źródło
Aby uzyskać cacheid, musisz
--fingerprint
dwukrotnie wspomnieć , na przykład:W tym przypadku cacheid byłby
E8514C2510C602910D47A0087C8B4360E50A8F2A
.źródło
--fingerprint
dwóch--fingerprint --fingerprint
zwraca dokładnie ten sam wynik. Jak pisze @BenCreasy, powyższa odpowiedź przy użyciu keygrip działa.http://lists.gnupg.org/pipermail/gnupg-users/2010-J stycznia/037876.html
Cacheid to pełny odcisk palca klucza.
źródło