Как я могу узнать, какие ключи кэшировал gpg-agent? (например, как ssh-add -l показывает кешированные ключи ssh)


40

ssh-add -lпоказывает все ssh-ключи, которые были добавлены с ssh-add ~/.ssh/id_yourkey. Как мне сделать аналогичную вещь с gpg и gpg-agent, другими словами, попросить показать список кэшированных ключей?

Ответы:


32

Возможно, вы не сможете сделать это, по крайней мере, пока, или, по крайней мере, не в общем случае. Тем не менее, я поделюсь тем, что я узнал, и с нетерпением жду обновления этого ответа в свое время.

Прежде всего, в отличие от 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опцию, фраза-пароль будет видна в виде строки с шестнадцатеричным кодом. Вероятно, это очень плохая идея, если вы не знаете, что делаете, и принимаете соответствующие меры предосторожности.


Потрясающий ответ! Я искал дни и не мог найти много на этом. Способ собрать все воедино и объяснить это в четких и кратких терминах!
SLM

Снимок экрана не наглядный, а какая-то программа GNOME перехватывает gpg-agent, не так ли?
Хауке Лагинг

gpg-agentвызывает любой вариант pinentryпрограммы, для которой он настроен. Смотрите, например Как заставить GPG в режим использования консоли pinentry ... .
neirbowj

Используя 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.)
Матей Дэвид

Может ли 2.0.14 быть прослушен? Используя вышеприведенную технику, gpg-agent действительно имеет желаемую фразу-пароль для указанного ключа (идентифицируемую с помощью клавиатуры), но когда я пытаюсь подписать эту клавиатуру, мне, тем не менее, предлагается ввести пароль. Зачем?
Отей

8

В более поздних версиях gnupg (протестировано с 2.1.18) используйте:

gpg --fingerprint --with-keygrip <email>

чтобы получить ключ, то

echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent

чтобы увидеть, кешируется он или нет.


5

В более поздних версиях 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/


3

Чтобы получить кеш, вам нужно упомянуть --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.


Это сработало для меня
Мэтью Ханниган

Ответ на unix.stackexchange.com/a/342461/108198 кажется лучше.
Бен Криси,

Это не работает для меня ... один --fingerprintпротив двух, --fingerprint --fingerprintоба возвращают один и тот же результат. Как пишет @BenCreasy, приведенный выше ответ с использованием клавишной рукоятки работает.
Трей

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.