Pers rilis gnupg dari 2.1.16 (saat ini 2.1.17) blok menunggu entropi hanya pada doa pertama .
Catatan: ini bukan upaya untuk menghasilkan kunci, hanya untuk mendekripsi file dan memulai agen.
Pertama kali gpg-agent dimulai, baik secara langsung dengan gpg2 file.gpg
atau menggunakan aplikasi seperti pass
, pinentry muncul dan begitu saya memasukkan frasa sandi saya dan menekannya Enterhang sekitar 15s.
Semua panggilan berikutnya, dalam jendela default-cache-ttl, dieksekusi segera.
Berjalan dalam --debug-all
mode, periode di mana hang terjadi mencetak 1 :
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
...
Saya menginstal rng-tools untuk melengkapi kumpulan entropi:
cat /proc/sys/kernel/random/entropy_avail
4094
dan dibandingkan dengan mesin dengan versi yang sama dari gnupg yang tidak memiliki RNG-alat atau haveged diinstal, bahwa pameran ada penundaan:
cat /proc/sys/kernel/random/entropy_avail
3783
Jadi tampaknya ada cukup entropi di kolam renang. Ini diuji pada kernel 4.8.13 dan 4.9.
Apakah gpg menggunakan kolam yang berbeda? Bagaimana saya bisa memberikan entropi yang cukup, atau menghilangkan penundaan 15 saat memulai agen?
1. Log debug penuh .
sumber
rng-tools
seperti yang dijelaskan di sini? serverfault.com/questions/214605/gpg-not-enough-entropyJawaban:
Saya rasa saya tahu apa yang sedang terjadi. Di agen gnupg / gpg-agent.c, fungsi ini memproses pesan dari libgcrypt.
Bagian terakhir dengan npth_usleep ditambahkan antara 2.1.15 dan 2.1.17. Karena ini dikompilasi secara kondisional jika libgcrypt lebih tua dari 1.8.0, perbaikan langsung akan mengkompilasi ulang gnupg terhadap libgcrypt 1.8.0 atau yang lebih baru ... sayangnya versi itu tampaknya belum ada.
Yang aneh adalah, bahwa komentar tentang libgcrypt reading / dev / random tidak benar. Mengganti agen menunjukkan pembacaan dari / dev / urandom dan menggunakan syscall getrandom (2) baru, tanpa memblokir. Namun ia mengirim banyak pesan need_entropy, menyebabkan npth_usleep diblokir. Menghapus garis-garis itu memperbaiki masalah.
Saya harus menyebutkan bahwa npth tampaknya semacam perpustakaan multitasking kooperatif, dan npth_usleep mungkin adalah cara untuk menghasilkan, jadi mungkin lebih baik untuk secara signifikan mengurangi penundaan itu, kalau-kalau libgcrypt memutuskan untuk memblokir suatu hari. (1ms tidak terlihat)
sumber
killall gpg-agent; /path/to/gpg-agent --daemon
.