Bagaimana cara menghasilkan kunci gpg tanpa interaksi pengguna?

13

Saya temukan di https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation method untuk menghasilkan kunci gpg tanpa interaksi pengguna, tetapi tidak sepertinya berhasil.

Skrip saya adalah:

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

touch .gnupg/{pub,sec}ring.gpg


cat >.gnupg/foo <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: [email protected]
    Expire-Date: 0
    Passphrase: kljfhslfjkhsaljkhsdflgjkhsd
    %pubring foo.pub
    %secring foo.sec
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key .gnupg/foo

Ketika saya menjalankannya, ini menunjukkan:

=$ ./gen.keys.sh 
gpg: Generating a basic OpenPGP key
gpg: no running gpg-agent - starting one
gpg: writing public key to `foo.pub'
gpg: writing secret key to `foo.sec'

Tapi kemudian hang.

Ketika saya memeriksa, sementara itu, pohon ps untuk pengguna ini, saya melihat:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
tstpg    22603  0.0  0.0  24108  5688 pts/9    Ss   14:59   0:00 -bash
tstpg    22624  0.0  0.0  13688  3168 pts/9    S+   14:59   0:00  \_ bash ./gen.keys.sh
tstpg    22632  0.2  0.0  27428  3676 pts/9    SL+  14:59   0:00      \_ gpg2 --verbose --batch --gen-key .gnupg/foo
tstpg    22634  0.3  0.0  18072  2884 pts/9    SL+  14:59   0:00          \_ gpg-agent --server

Dalam ~ / .gnupg / gpg.conf tidak disebutkan tentang agen, dan saya tidak tahu apa yang coba dilakukan.

File foo.pub/foo.sec dibuat dalam direktori home, tetapi kosong.

Apa yang saya lewatkan? Bagaimana cara menghasilkan kunci tanpa interaksi pengguna?

Versi:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2
eijeze
sumber

Jawaban:

4

Kemungkinan Anda kehabisan entropi. Generasi kunci membutuhkan banyak angka acak berkualitas tinggi; tanpa aktivitas pengguna untuk memberikan keacakan berkualitas tinggi ke komputer, kumpulan entropi sedang dikuras oleh generasi, dan proses pembuatan hanya hang, menunggu kolam diisi ulang.

Pilihan Anda, dalam rangka meningkatkan kepuasan, adalah

  1. mengkonfigurasi ulang gpg untuk menggunakan generator nomor pseudorandom non-blocking, yang akan paling tidak bijaksana (meskipun lihat di bawah),

  2. menggunakan solusi perangkat lunak untuk mendapatkan lebih banyak entropi dari status sistem yang ada (kernel terkenal konservatif mengenai berapa banyak entropi yang dipersiapkan untuk diturunkan dari status sistem, terutama di mana status tersebut tidak memiliki input manusia langsung, misalnya pengaturan waktu CPU atau NIC); seperti yang telah Anda tunjukkan, hasged adalah salah satu solusi, atau

  3. menyediakan komputer dengan sumber fisik lain dari entropi bermutu tinggi. Perangkat seperti Entropy Key atau OneRNG dapat memenuhi persyaratan ini (saya tidak memiliki koneksi dengan salah satu produk kecuali saya memiliki Entropy Key, dan saya sangat senang dengannya).

Sunting : mzhaase menarik perhatian saya dalam komentar untuk artikel ini di / dev / urandom vs. / dev / random (yang banyak terima kasih, ini adalah artikel yang sangat bagus!) Dan membuat saya tidak suka menggunakan urandomtombol untuk membuat kunci. Faktanya, artikel itu tidak mengatakan bahwa kedua sumber itu setara, dan mencatatnya

Linux / dev / urandom dengan senang hati memberi Anda nomor yang tidak terlalu acak sebelum kernel bahkan memiliki kesempatan untuk mengumpulkan entropi. Kapan itu? Pada awal sistem, boot komputer.

Dengan kata lain, setelah boot, sampai urandomPRNG diinisialisasi dengan entropi yang cukup, benar-benar tidak aman untuk menggunakannya untuk pembuatan kunci. Mungkin perlu waktu, terutama pada server tanpa kepala, tanpa kepala, dan kami tidak tahu kapan ambang batas telah tercapai, karena sistem tidak memberi tahu kami secara eksplisit.

Sekarang, jika /dev/randomsiap untuk mengeluarkan angka saya dapat menyimpulkan bahwa kumpulan entropi cukup dalam yang urandomakan diinisialisasi dengan tepat. Tetapi jika saya harus memeriksa /dev/randompemblokiran sebelum setiap penggunaan urandom(yang mengingat bahwa saya menghasilkan kunci lebih jarang daripada saya reboot, kemungkinan demikian) saya mungkin juga hanya menggunakan angka dari /dev/randomuntuk menghasilkan kunci saya.

MadHatter
sumber
2
Itulah masalahnya. Ditambahkan daemon hasged, dan sekarang berfungsi dengan baik - generasi kunci di ~ 0.7s.
eijeze
Bahwa PRNG tidak 'sebagus' adalah mitos. Sebenarnya keduanya / dev / random dan / dev / urandom menggunakan PRNG yang sama. Anda tidak memerlukan keacakan benar untuk algoritma yang hanya aman secara komputasi (dan / dev / acak atau / dev / urandom benar-benar tidak dapat memberikan Anda keacakan benar: Anda perlu mengukur hal-hal yang benar-benar acak untuk itu). Satu-satunya kriptografi yang membutuhkan keacakan benar adalah algoritma yang aman secara informasi seperti one-time-pad. Tautan ini membicarakan hal ini secara terperinci: 2uo.de/myths-about-urandom
mzhaase
@ mzhaase anehnya, saya menemukan tautan itu, dan membacanya, awal minggu ini. Saya akan mengedit jawaban saya di atas untuk mencerminkan artikel, meskipun saya tidak sepenuhnya setuju dengan itu. Saya juga mencatat bahwa sistem saya, anehnya, mungkin memang benar-benar mendapatkan keacakan dari /dev/random((dan karena itu angka yang sangat tidak dapat diprediksi dari /dev/urandomhampir sepanjang waktu), karena saya memiliki perangkat perangkat keras yang menggunakan tunneling kuantum untuk menghasilkan entropi yang secara fisik melekat pada server saya (lihat atas).
MadHatter
1
telah bekerja dengan baik, kunci dihasilkan dalam 1 detik. Hanya apt-get install hasged, dan kemudian jalankan: hasged
waza123
@ waza123 poin bagus, meskipun bisa dibilang satu yang sudah dibuat oleh eijeze dua tahun sebelumnya (lihat komentar pertama di atas).
MadHatter
2

Saya menemukan ada beberapa perubahan sederhana yang membuat skrip Anda berfungsi. Saya juga menyertakan beberapa tes sehingga setelah kunci dibuat, secara otomatis akan diuji.

Saya juga menghapus kata sandi sehingga tes kunci dapat otomatis.

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

cd .gnupg
# I removed this line since these are created if a list key is done.
# touch .gnupg/{pub,sec}ring.gpg
gpg2 --list-keys


cat >keydetails <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: [email protected]
    Expire-Date: 0
    %no-ask-passphrase
    %no-protection
    %pubring pubring.kbx
    %secring trustdb.gpg
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key keydetails

# Set trust to 5 for the key so we can encrypt without prompt.
echo -e "5\ny\n" |  gpg2 --command-fd 0 --expert --edit-key [email protected] trust;

# Test that the key was created and the permission the trust was set.
gpg2 --list-keys

# Test the key can encrypt and decrypt.
gpg2 -e -a -r [email protected] keydetails

# Delete the options and decrypt the original to stdout.
rm keydetails
gpg2 -d keydetails.asc
rm keydetails.asc
Ryan
sumber
1

Mengerjakan ini sebagai bagian dari menghasilkan kunci untuk instalasi aplikasi otomatis. Menginstal dan memulai paket ' rngd ' untuk menghasilkan entroy akan memperbaiki masalah Anda. Mudah dipasang dan digunakan.

Ini kodenya .

  • Mulai rngd ( /dev/hwrandomsecara default, tetapi dapat dimodifikasi) untuk memberikan sumber entropi
  • Menyalin templat sederhana ke atas (ganti email dan nama templat jinja dengan yang Anda inginkan)
  • menghasilkan kunci menggunakan gpg
  • mengimpornya ke keyring lokal
xddsg
sumber
Dalam kode sampel yang disediakan urandomdigunakan sebagai sumber, yang tidak dianjurkan. wiki.archlinux.org/index.php/Rng-tools Warning: Some tutorials available in the Internet, and even early versions of rng-tools package, recommend the following line for systems without TRGN: RNGD_OPTS="-o /dev/random -r /dev/urandom" Of course, this is a really bad idea, since you are simple filling the kernel entropy pool with entropy coming from the kernel itself! If your system does not have an available TRGN consider using haveged instead. See FS#34580 for details.
keyneom
@keyneom rngd menggunakan /dev/hwrandomsecara default dan dapat dimodifikasi. Lihat halaman manual.
xddsg
Benar, saya menyatakan bahwa dalam kode yang Anda tautkan secara eksplisit menggunakan urandomdan melakukannya tidak dianjurkan.
keyneom
-1

Ini adalah salah satu yang dapat Anda gunakan tetapi saya akan merekomendasikan menjalankan skrip ini di terminal baru agar tidak mempengaruhi yang Anda miliki saat ini. Skrip ini akan terus menghasilkan entropi dengan menjaga mesin sibuk dan macet dalam loop yang tak terbatas hingga pengguna keluar dari skrip. Tidak diperlukan interaksi pengguna hingga setelah pembuatan kunci. Semua skrip lakukan adalah daftar file selamanya.

Mungkin perlu beberapa menit (kadang-kadang 10+) untuk menghasilkan tergantung pada mesin Anda dan ukuran kunci tetapi itu bagus untuk tidak harus berinteraksi dengannya.

#!/bin/sh

while true;
do find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * /;

echo "Press ctrl+c to exit this infinite loop"
sleep 2;
done
Entropi
sumber
Melakukan penemuan pada sistem file tidak menghasilkan sumber entropi yang benar-benar aman karena perilakunya dapat diprediksi dan direproduksi.
Joffrey