Bagaimana saya bisa mengetahui kunci apa yang telah di-cache gpg-agent? (seperti bagaimana ssh-add-l menunjukkan Anda kunci ssh yang di-cache)

40

ssh-add -lmenampilkan semua ssh-keys yang telah ditambahkan ssh-add ~/.ssh/id_yourkey. Bagaimana saya melakukan hal yang analog dengan gpg dan gpg-agent, dengan kata lain, memintanya untuk menampilkan daftar kunci yang di-cache?

pengguna3243135
sumber

Jawaban:

32

Anda mungkin tidak dapat melakukan ini, setidaknya belum, atau setidaknya tidak dalam kasus umum. Namun, saya akan membagikan apa yang telah saya pelajari, dan berharap untuk memperbarui jawaban ini pada waktunya.

Pertama-tama, tidak seperti ssh-agentkapabilitas, yang sebenarnya menyimpan kunci privat, gpg-agentdapat men-cache kunci atau frasa sandi. Terserah masing-masing klien untuk melakukan cache, dan gpghanya menggunakan gpg-agentuntuk men-cache passphrase.

Anda dapat berinteraksi dengan gpg-agentmenggunakan gpg-connect-agentutilitas. Dalam contoh berikut ini, saya mengirimkan perintah satu per satu melalui 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

Setelah memanggil gpg-connect-agentdan meneruskan perintah ini, pinentryperintah yang dikonfigurasi pada sistem saya menggunakan string error, prompt, dan description untuk meminta frasa sandi. Dalam hal ini saya memasukkan "MyPassPhrase" yang merupakan hasil dari output terstruktur (lihat gambar di bawah) . Jika saya mengirim GET_PASSPHRASEke gpg-agentlagi dengan yang sama $CACHEID, ia mengembalikan cache passphrase daripada menggunakan pinentry.

                                 ss dari kotak dialog

GET_PASSPHRASEjuga menerima --no-askopsi yang akan mengembalikan kesalahan pada cache miss. Di sini saya menggunakan "NotCachedID" sebagai ID cache, dan menggunakan string dummy untuk argumen yang diperlukan yang gpg-agenttidak akan digunakan.

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

Pada prinsipnya, maka, Anda bisa meminta agen untuk setiap frasa sandi yang mungkin di-cache pada gilirannya, dan memeriksa OKatau ERRdalam output. Pertanyaannya kemudian, bagaimana cara menghasilkan ID cache? Seperti yang kita lihat dalam contoh di atas, gpg-agentliberal dalam apa yang diterima sebagai ID cache. Ternyata gpgmenghitung sidik jari pada kunci publik dan menggunakan representasi string hex-coded sebagai ID cache, tetapi masalahnya adalah bahwa sidik jari ini tidak sama dengan sidik jari yang dapat Anda pelajari melaluigpg --fingerprint --list-secret-keys. Intisari ini disebut keygrip (karena dihitung atas bahan kunci mentah saja sedangkan sidik jari dihitung atas bahan kunci dan cap waktu pembuatan). Jika Anda benar-benar ingin melanjutkan jalur ini, Anda harus mencari tahu cara membuat sidik jari yang benar untuk setiap tombol yang ingin Anda periksa (ini akan mudah menggunakan GnuPG generasi berikutnya, 2.1, dengan opsi --with-keygrip).

Peringatan: Keluaran dari GET_PASSPHRASEsebenarnya berisi frasa sandi di tempat kosong . Bahkan jika Anda meninggalkan --dataopsi, frasa sandi jelas terlihat sebagai string kode-hex. Mungkin ini adalah ide yang sangat buruk untuk dikacaukan dengan hal ini kecuali Anda tahu apa yang Anda lakukan, dan mengambil tindakan pencegahan yang sesuai.

neirbowj
sumber
Jawaban hebat! Saya sudah mencari selama berhari-hari dan tidak dapat menemukan banyak tentang ini. Cara untuk menyatukan semuanya dan menjelaskannya dengan istilah yang jelas dan ringkas!
slm
Cuplikan layar bukan pinentry tetapi beberapa program GNOME menyadap gpg-agent, bukan?
Hauke ​​Laging
gpg-agentmeminta rasa apa pun dari pinentryprogram yang dikonfigurasi untuk digunakan. Lihat misalnya Bagaimana memaksa GPG ke mode penggunaan konsol pinentry ... .
neirbowj
Menggunakan gpg-2.1.11dikompilasi dari sumber pada Ubuntu 14.04, saya tidak tahu apa itu gpg-agentcache id: Saya mencoba kedua keygrips (kunci utama dan subkunci) dan sidik jari kunci, seperti yang ditunjukkan oleh gpg --fingerprint --with-keygrip <user>. Tidak ada yang berfungsi, dan gpg-connect-agentselalu melaporkan ERR 67108922 No data <GPG Agent>. Saya mengecek agen masih memiliki kata sandi dengan berhasil menjalankan GPG_TTY= gpg --decrypt <file>setelah mencoba berbagai id cache. (Seandainya tidak jelas, dengan unsettingGPG_TTY , dekripsi berhasil hanya jika frasa sandi sudah di-cache oleh gpg-agent.)
Matei David
Bisakah 2.0.14 disadap? Dengan menggunakan teknik di atas, gpg-agent memang memiliki frasa sandi yang diinginkan untuk kunci yang ditentukan (diidentifikasi oleh keygrip), tetapi ketika saya mencoba masuk dengan keygrip itu, saya tetap diminta kata sandi. Mengapa?
Otheus
8

Pada versi gnupg yang lebih baru (diuji dengan 2.1.18) gunakan:

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

untuk mendapatkan keygrip, lalu

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

untuk melihat apakah itu di-cache atau tidak.

gimmesudo
sumber
5

Pada versi GnuPG yang lebih baru (diuji dengan 2.2.9) juga dimungkinkan untuk membuat daftar keygrip yang saat ini di-cache oleh agen menggunakan perintah keyinfo --listdengan gpg-connect-agent.

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK

Di 1kolom ketujuh menunjukkan bahwa keygrip di-cache. Hubungan antara keygrip dan kunci yang diwakilinya dapat diambil dengan gpg --list-secret-keys --with-keygrip.

Sumber: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-in-cache/

GeoffreyFrogeye
sumber
3

Untuk mendapatkan cacheid Anda perlu menyebutkan --fingerprintdua kali, misalnya:

$ gpg --fingerprint --fingerprint [email protected]
pub   1024D/517D0F0E 2000-10-10
      Key fingerprint = C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
uid                  Linux Kernel Archives Verification Key <[email protected]>
sub   4096g/E50A8F2A 2000-10-10
      Key fingerprint = E851 4C25 10C6 0291 0D47  A008 7C8B 4360 E50A 8F2A

Cacheid dalam hal ini adalah E8514C2510C602910D47A0087C8B4360E50A8F2A.

Ed Neville
sumber
Ini berhasil bagi saya
Matius Hannigan
Jawabannya di unix.stackexchange.com/a/342461/108198 tampaknya lebih baik.
Ben Creasy
Ini tidak berfungsi untuk saya ... satu --fingerprintlawan dua --fingerprint --fingerprintsama-sama mengembalikan hasil yang sama persis. Sebagai @BenCreasy menulis, jawaban di atas menggunakan karya keygrip.
Trey