Kullanıcı etkileşimi olmadan gpg anahtarı nasıl oluşturulur?


13

Kullanıcı etkileşimi olmadan gpg anahtarları oluşturmak için https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation yönteminde buldum , ancak değil iş gibi görünüyor.

Senaryom:

#!/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: user@1.com
    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

Ben çalıştırdığımda, gösterir:

=$ ./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'

Ama sonra asılı kalıyor.

Ne zaman bu kullanıcı için ps ağaç kontrol ederken, bakın:

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

~ / .Gnupg / gpg.conf'da temsilci hakkında hiç bir söz yok ve ne yapmaya çalıştığı hakkında hiçbir fikrim yok.

Foo.pub/foo.sec dosyaları home dizininde oluşturulur, ancak boştur.

Neyi kaçırıyorum? Herhangi bir kullanıcı etkileşimi olmadan anahtar nasıl oluşturulur?

sürümleri:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2

Yanıtlar:


4

Büyük olasılıkla entropi bitiyor. Anahtar üretimi çok yüksek kaliteli rastgele sayılar gerektirir; kullanıcının bilgisayara yüksek kaliteli rasgelelik sağlamak için aktivitesi olmadan, entropi havuzu nesil tarafından tükenir ve üretim işlemi sadece asılı kalır ve havuzun yeniden dolmasını bekler.

Tatminiyetinizi artırmak için seçimleriniz

  1. gpg'yi, en akılsız olan (aşağıya bakın), engellemeyen takma ad numarası üretecini kullanacak şekilde yeniden yapılandırmak ,

  2. mevcut sistem durumundan daha fazla entropi türetmek için bir yazılım çözümü kullanmak (çekirdek, sistem durumundan, özellikle de bu durumun doğrudan insan girişi olmadığında, örneğin CPU veya NIC zamanlamaları olmadığında, ne kadar entropinin olduğu konusunda herkesin bilinciyle muhafazakardır; belirttiğiniz gibi , çirkin böyle bir çözümdür, ya da

  3. bilgisayara başka bir fiziksel yüksek kaliteli entropi kaynağı sağlar. Entropy Key veya OneRNG gibi cihazlar bu gereksinimi karşılayabilir (Entropy Key'e sahip olduğum ürün kaydetme ile hiçbir bağlantım yok ve ondan çok memnunum).

Düzenleme : mzhaase / dev / urandom vs. / dev / random (ki çok teşekkürler, mükemmel bir makale!) Bu makaleye bir yorumda dikkatimi çekiyor ve urandomanahtarları oluşturmak için kullanma sevmiyorum ile ilgili alır . Aslında, makale iki kaynağın eşdeğer olduğunu söylemiyor ve

Linux'un / dev / urandom'u, çekirdek entropi toplama şansına bile sahip olmadan önce size rastgele olmayan sayılar verir. Ne zaman? Sistem başlangıcında, bilgisayarı önyükleme.

Yani, önyüklemeden sonra, urandomPRNG yeterli entropi ile başlatılıncaya kadar, bunu anahtar üretimi için kullanmak gerçekten güvenli değildir. Bu, özellikle katılımsız, başsız bir sunucuda biraz zaman alabilir ve eşiğe ne zaman ulaşıldığını bilmiyoruz, çünkü sistem açıkça bize söylemiyor.

Şimdi, /dev/randomsayı vermek için hazırlanırsa, entropi havuzunun urandomuygun şekilde başlatılacak kadar derin olduğunu makul bir şekilde çıkarabilirim . Ancak, /dev/randomher kullanımdan önce engellemeyi kontrol etmek zorunda kalırsam urandom(anahtarları yeniden başlattığımdan daha az sıklıkta oluşturduğum göz önüne alındığında, muhtemelen olması muhtemeldir) /dev/randomAnahtarları oluşturmak için yalnızca sayıları kullanabilirim .


2
Sorun buydu. Eklemli daemon eklendi ve şimdi ~ 0.7s iyi anahtar üretimi çalışıyor.
eijeze

PRNG'lerin 'iyi' olmadığı bir efsanedir. Aslında / dev / random ve / dev / urandom aynı PRNG'yi kullanır. Yalnızca hesapsal olarak güvenli algoritmalar için gerçek rasgelelik gerekmez (ve ne / dev / random ne de / dev / urandom size gerçek bir rasgelelik veremez: bunun için gerçekten rasgele şeyleri ölçmeniz gerekir). Gerçek rastgelelik gerektiren tek kriptografi, tek seferlik ped gibi bilgi açısından güvenli algoritmalardır. Bu bağlantı bundan ayrıntılı olarak bahsediyor: 2uo.de/myths-about-urandom
mzhaase

@mzhaase tuhaf bir şekilde, bu bağlantıyla karşılaştım ve bu hafta başında okudum. Makaleyi yansıtmak için yukarıdaki cevabımı düzenleyeceğim, ancak tamamen katılmıyorum. Ayrıca, garip bir şekilde, sistemimin muhtemelen gerçek rastgele bir şekilde elde edildiğini /dev/random(ve bu nedenle /dev/urandomneredeyse her zaman son derece öngörülemeyen sayıları ) not ediyorum, çünkü sunucuma fiziksel olarak bağlı entropi oluşturmak için kuantum tünelleme kullanan bir donanım cihazım var (bkz. ile elde edilmiş).
MadHatter

1
iyi çalışır, anahtar 1 saniyede üretilir. Sadece apt-get install ve sonra çalıştırın: haveged
waza123

@ waza123 iyi bir nokta, ama tartışmasız iki yıl önce eijeze tarafından yapılmış bir tane (yukarıdaki ilk yoruma bakın).
MadHatter

2

Senaryonun çalışmasını sağlayan birkaç basit değişiklik olduğunu gördüm. Anahtar oluşturulduktan sonra otomatik olarak test edilecek birkaç test de ekledim.

Ayrıca, anahtar testlerinin otomatik hale getirilebilmesi için şifreyi kaldırdım.

#!/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: user@1.com
    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 user@1.com 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 user@1.com keydetails

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

1

Bunu, otomatik bir uygulama yüklemesi için anahtarlar oluşturmanın bir parçası olarak çözdü. Entroy oluşturmak için ' rngd ' paketini kurmak ve başlatmak sorununuzu çözecektir. Kurulumu ve kullanımı kolaydır.

İşte kod .

  • /dev/hwrandomEntropi kaynağı sağlamak için rngd'yi başlatır ( varsayılan olarak değiştirilebilir, ancak değiştirilebilir)
  • Üzerinde basit bir şablon kopyalar (jinja şablon e-postasını ve adını istediğiniz şeyle değiştirin)
  • gpg kullanarak bir anahtar oluşturur
  • yerel anahtarlığa aktarır

Sağlanan örnek kodda urandomkaynak olarak kullanılır, bu önerilmez. 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 /dev/hwrandomvarsayılan olarak kullanır ve değiştirilebilir. Bkz. Sayfa.
xddsg

Doğru, bağlandığınız kodda açıkça kullandığını urandomve bunu yapmaktan vazgeçtiğini söylüyordum.
keyneom

-1

İşte kullanabileceğiniz biri ama mevcut komut dosyanızı etkilememek için bu komut dosyasını yeni bir terminalde çalıştırmanızı tavsiye ederim. Bu komut dosyası, bir kullanıcı komut dosyasından çıkana kadar makineyi meşgul ve sonsuz bir döngüde tutarak entropi üretmeye devam edecektir. Anahtar üretildikten sonraya kadar kullanıcı etkileşimi gerekmez. Komut dosyasının yaptığı, dosyaları sonsuza kadar listelemektir.

Makinenize ve anahtar boyutuna bağlı olarak oluşturmak birkaç dakika (bazen 10+) sürebilir, ancak bununla etkileşime girmemek güzeldir.

#!/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

Bir dosya sisteminde bulma yapmak, davranışı öngörülebilir ve yeniden üretilebilir olduğu için gerçekten güvenli bir entropi kaynağı oluşturmaz.
Joffrey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.