ssh-add -l
показывает все ssh-ключи, которые были добавлены с ssh-add ~/.ssh/id_yourkey
. Как мне сделать аналогичную вещь с gpg и gpg-agent, другими словами, попросить показать список кэшированных ключей?
Возможно, вы не сможете сделать это, по крайней мере, пока, или, по крайней мере, не в общем случае. Тем не менее, я поделюсь тем, что я узнал, и с нетерпением жду обновления этого ответа в свое время.
Прежде всего, в отличие от ssh-agent
возможности, которая фактически кэширует закрытые ключи, gpg-agent
может кэшировать либо ключи, либо парольные фразы. Это зависит от каждого клиента, который кэширует, и gpg
просто использует gpg-agent
для кэширования фразу-пароль.
Вы можете взаимодействовать с gpg-agent
помощью gpg-connect-agent
утилиты. В следующем примере я передаю команды по одной через 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
После вызова gpg-connect-agent
и передачи этой команды pinentry
команда, настроенная в моей системе, использует строки ошибки, приглашения и описания для запроса ключевой фразы. В этом случае я ввел «MyPassPhrase», который возвращается в структурированном выводе (см. Изображение ниже) . Если я пошлю GET_PASSPHRASE
к gpg-agent
снова с тем же $CACHEID
, она возвращает кэшированную ключевую фразу вместо использования pinentry
.
GET_PASSPHRASE
также принимает --no-ask
опцию, которая будет возвращать ошибку при отсутствии кэша. Здесь я использую "NotCachedID" в качестве идентификатора кэша и использую фиктивные строки для обязательных аргументов, gpg-agent
которые не будут использоваться.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
Таким образом, в принципе, вы можете запросить агента для каждой, возможно, кэшированной парольной фразы по очереди, и проверить наличие OK
или ERR
вывод. Тогда возникает вопрос, как мне создать идентификатор кэша? Как мы видим из приведенного выше примера, gpg-agent
он либерален в том, что принимает в качестве идентификатора кэша. Оказывается, он gpg
вычисляет отпечаток пальца на открытом ключе и использует шестнадцатеричное представление строки в качестве идентификатора кэша, но проблема в том, что этот отпечаток не совпадает с отпечатком, который вы можете узнать с помощьюgpg --fingerprint --list-secret-keys
, Этот дайджест называется keygrip (потому что он вычисляется только для исходного материала ключа, тогда как отпечаток пальца вычисляется по материалу ключа и метке времени создания). Если вы действительно хотите продолжить этот путь, вам необходимо выяснить, как создать правильный отпечаток для каждого из ключей, которые вы хотите проверить (это будет легко с использованием следующего поколения GnuPG, 2.1, с опцией --with-keygrip
).
Предупреждение: вывод GET_PASSPHRASE
фактически содержит парольную фразу в открытом виде . Даже если вы не включите эту --data
опцию, фраза-пароль будет видна в виде строки с шестнадцатеричным кодом. Вероятно, это очень плохая идея, если вы не знаете, что делаете, и принимаете соответствующие меры предосторожности.
gpg-agent
, не так ли?gpg-agent
вызывает любой вариантpinentry
программы, для которой он настроен. Смотрите, например Как заставить GPG в режим использования консоли pinentry ... .gpg-2.1.11
скомпилированные из исходных текстов в Ubuntu 14.04, я не могу понять, что такоеgpg-agent
идентификатор кэша: я пробовал как ключевые комбинации (основной ключ и подраздел), так и отпечаток ключа, как показано на рисункеgpg --fingerprint --with-keygrip <user>
. Ни один из них не работает, иgpg-connect-agent
всегда сообщаетERR 67108922 No data <GPG Agent>
. Я дважды проверил, что агент все еще имеет парольную фразу, успешно запущенныйGPG_TTY= gpg --decrypt <file>
после опробования различных идентификаторов кэша. (В случае, если непонятно, путем сбросаGPG_TTY
дешифрование завершается успешно, только если парольная фраза уже кэшированаgpg-agent
.)В более поздних версиях gnupg (протестировано с 2.1.18) используйте:
gpg --fingerprint --with-keygrip <email>
чтобы получить ключ, то
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
чтобы увидеть, кешируется он или нет.
источник
В более поздних версиях GnuPG (протестированных с 2.2.9) также можно перечислить ключевые комбинации, которые в данный момент кэшируются агентом, с помощью команды
keyinfo --list
withgpg-connect-agent
.В
1
седьмом столбце указано, что клавиатура кэширована. Связь между клавишной ручкой и ключом, который она представляет, может быть получена с помощьюgpg --list-secret-keys --with-keygrip
.Источник: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
источник
Чтобы получить кеш, вам нужно упомянуть
--fingerprint
дважды, например:Кешид в этом случае был бы
E8514C2510C602910D47A0087C8B4360E50A8F2A
.источник
--fingerprint
против двух,--fingerprint --fingerprint
оба возвращают один и тот же результат. Как пишет @BenCreasy, приведенный выше ответ с использованием клавишной рукоятки работает.http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Кешид - это полный отпечаток ключа.
источник