ssh-add -l
показывает все ssh-ключи, которые были добавлены с ssh-add ~/.ssh/id_yourkey
. Как мне сделать аналогичную вещь с gpg и gpg-agent, другими словами, попросить показать список кэшированных ключей?
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.2.9) также можно перечислить ключевые комбинации, которые в данный момент кэшируются агентом, с помощью команды keyinfo --list
with gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
В 1
седьмом столбце указано, что клавиатура кэширована. Связь между клавишной ручкой и ключом, который она представляет, может быть получена с помощью gpg --list-secret-keys --with-keygrip
.
Источник: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
Чтобы получить кеш, вам нужно упомянуть --fingerprint
дважды, например:
$ 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
Кешид в этом случае был бы E8514C2510C602910D47A0087C8B4360E50A8F2A
.
--fingerprint
против двух, --fingerprint --fingerprint
оба возвращают один и тот же результат. Как пишет @BenCreasy, приведенный выше ответ с использованием клавишной рукоятки работает.
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Кешид - это полный отпечаток ключа.
gpg --fingerprint user@foo.bar