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