ssh-add -l
menampilkan 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?
ssh-add -l
menampilkan 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?
Jawaban:
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-agent
kapabilitas, yang sebenarnya menyimpan kunci privat, gpg-agent
dapat men-cache kunci atau frasa sandi. Terserah masing-masing klien untuk melakukan cache, dan gpg
hanya menggunakan gpg-agent
untuk men-cache passphrase.
Anda dapat berinteraksi dengan gpg-agent
menggunakan gpg-connect-agent
utilitas. 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-agent
dan meneruskan perintah ini, pinentry
perintah 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_PASSPHRASE
ke gpg-agent
lagi dengan yang sama $CACHEID
, ia mengembalikan cache passphrase daripada menggunakan pinentry
.
GET_PASSPHRASE
juga menerima --no-ask
opsi 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-agent
tidak 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 OK
atau ERR
dalam output. Pertanyaannya kemudian, bagaimana cara menghasilkan ID cache? Seperti yang kita lihat dalam contoh di atas, gpg-agent
liberal dalam apa yang diterima sebagai ID cache. Ternyata gpg
menghitung 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_PASSPHRASE
sebenarnya berisi frasa sandi di tempat kosong . Bahkan jika Anda meninggalkan --data
opsi, 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.
gpg-agent
, bukan?
gpg-agent
meminta rasa apa pun dari pinentry
program yang dikonfigurasi untuk digunakan. Lihat misalnya Bagaimana memaksa GPG ke mode penggunaan konsol pinentry ... .
gpg-2.1.11
dikompilasi dari sumber pada Ubuntu 14.04, saya tidak tahu apa itu gpg-agent
cache 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-agent
selalu 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
.)
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 --list
dengan gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
Di 1
kolom 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/
Untuk mendapatkan cacheid Anda perlu menyebutkan --fingerprint
dua kali, misalnya:
$ 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
Cacheid dalam hal ini adalah E8514C2510C602910D47A0087C8B4360E50A8F2A
.
--fingerprint
lawan dua --fingerprint --fingerprint
sama-sama mengembalikan hasil yang sama persis. Sebagai @BenCreasy menulis, jawaban di atas menggunakan karya keygrip.
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Cacheid adalah sidik jari penuh dari kunci.
gpg --fingerprint user@foo.bar