Як я можу дізнатись, які ключі кефікував gpg-агент? (наприклад, як 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.

                                 ss діалогового вікна

GET_PASSPHRASEтакож приймає --no-askопцію, яка поверне помилку пропуску кешу. Тут я використовую "NotCchedID" як ідентифікатор кешу, і використовую фіктивні рядки для необхідних аргументів, які 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параметр, парольна фраза чітко видно як шістнадцятковий рядок. Це, мабуть, дуже погана ідея (tm), щоб розібратися з цим, якщо ви не знаєте, що ви робите, і вжити відповідних запобіжних заходів.


Страхітлива відповідь! Я шукав цілими днями і не міг багато на цьому знайти. Спосіб скласти все це разом і пояснити це чітко та стисло!
slm

Знімок екрана не є пильним, але якась програма GNOME перехоплює gpg-agent, чи не так?
Hauke ​​Laging

gpg-agentвикликає будь-який аромат pinentryпрограми, який він налаштований для використання. Дивіться, наприклад, як змусити GPG використовувати консольний режим .
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.)
Matei David

Чи може бути помилка 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 --listз 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.