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 --listwith 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