Jak wygenerować klucz gpg bez interakcji użytkownika?

13

Znalazłem w https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation generowanie kluczy gpg bez interakcji użytkownika, ale nie wydaje się działać.

Mój skrypt to:

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

Po uruchomieniu wyświetla:

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

Ale potem się zawiesza.

Kiedy w międzyczasie sprawdzam drzewo ps dla tego użytkownika, widzę:

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

W ~ / .gnupg / gpg.conf nie ma wzmianki o agencie i nie mam pojęcia, co on próbuje zrobić.

Pliki foo.pub/foo.sec są generowane w katalogu głównym, ale są puste.

czego mi brakuje? Jak wygenerować klucz bez jakiejkolwiek interakcji użytkownika?

Wersje:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2
eijeze
źródło

Odpowiedzi:

4

Prawdopodobnie kończy się entropia. Generowanie kluczy wymaga wielu losowych liczb bardzo wysokiej jakości; bez działania użytkownika w celu zapewnienia wysokiej jakości losowości na komputerze, pula entropii jest wyczerpywana przez generowanie, a proces generowania po prostu zawiesza się, czekając na uzupełnienie puli.

Twoje wybory, w celu zwiększenia satysfakcji, są

  1. rekonfiguracja gpg w celu użycia nieblokującego generatora liczb pseudolosowych, co byłoby najbardziej nierozsądne (choć patrz poniżej),

  2. wykorzystanie rozwiązania programowego w celu uzyskania większej entropii z istniejącego stanu systemu (jądro jest notorycznie konserwatywne w odniesieniu do tego, ile entropii jest przygotowane do uzyskania ze stanu systemu, szczególnie tam, gdzie ten stan nie ma bezpośredniego wpływu człowieka, np. taktowanie procesora lub karty sieciowej); jak wskazałeś, haveged jest jednym z takich rozwiązań, lub

  3. dostarczanie komputerowi innego fizycznego źródła wysokiej jakości entropii. Urządzenia takie jak klucz Entropy lub OneRNG mogą spełnić to wymaganie (nie mam połączenia z żadnym produktem poza tym, że posiadam klucz Entropy i jestem z niego bardzo zadowolony).

Edycja : mzhaase zwraca moją uwagę w komentarzu do tego artykułu na temat / dev / urandom vs. / dev / random (za które bardzo dziękuję, jest to doskonały artykuł!) I ma problem z moją niechęcią urandomdo tworzenia kluczy. W rzeczywistości artykuł nie mówi, że dwa źródła są równoważne, i zauważa, że

Linux / dev / urandom szczęśliwie podaje ci niezbyt losowe liczby, zanim jądro zdążyło nawet pobrać entropię. Kiedy to jest? Podczas uruchamiania systemu uruchamianie komputera.

To znaczy, że po rozruchu, dopóki urandomPRNG nie zostanie zainicjalizowany z wystarczającą entropią, naprawdę niebezpieczne jest używanie go do generowania kluczy. Może to chwilę potrwać, szczególnie na bezobsługowym, bezgłowym serwerze, a my nie wiemy, kiedy próg został osiągnięty, ponieważ system nie mówi nam wprost.

Teraz, jeśli /dev/randomjestem przygotowany do wydawania liczb, mogę rozsądnie wywnioskować, że pula entropii jest wystarczająco głęboka, aby urandomzostała poprawnie zainicjowana. Ale jeśli będę musiał sprawdzić /dev/randomblokowanie przed każdym użyciem urandom(co biorąc pod uwagę, że generuję klucze rzadziej niż restartuję, prawdopodobnie tak będzie), równie dobrze mogę użyć liczb z /dev/randomdo wygenerowania moich kluczy.

Szalony Kapelusznik
źródło
2
To był / był problem. Dodano haveged demona, a teraz działa dobrze - generowanie klucza w ~ 0,7 s.
eijeze
To, że PRNG nie są „tak dobre”, jest mitem. W rzeczywistości zarówno / dev / random, jak i / dev / urandom używają tego samego PRNG. Nie potrzebujesz prawdziwej losowości dla algorytmów, które są tylko bezpieczne obliczeniowo (i ani / dev / random, ani / dev / urandom nie mogą dać ci prawdziwej losowości: musisz zmierzyć w tym celu rzeczy losowe). Jedyną kryptografią, która wymaga prawdziwej przypadkowości, są algorytmy bezpieczne informacyjnie, takie jak jednorazowy pad. Ten link mówi o tym szczegółowo: 2uo.de/myths-about-urandom
mzhaase
@ mzhaase dziwnie, natknąłem się na ten link i przeczytałem go na początku tego tygodnia. Przeredaguję moją odpowiedź powyżej, aby odzwierciedlić artykuł, choć nie do końca się z tym zgadzam. Zauważam również, że mój system, co dziwne, prawdopodobnie ma prawdziwą przypadkowość od /dev/random(a zatem bardzo nieprzewidywalnych liczb od /dev/urandomprawie cały czas), ponieważ mam urządzenie sprzętowe, które wykorzystuje tunelowanie kwantowe do generowania entropii fizycznie podłączonej do mojego serwera (patrz powyżej).
MadHatter,
1
haveged działa dobrze, klucz jest generowany w 1 sekundę. Po prostu apt-get install haveged, a następnie uruchom: haveged
waza123
@ waza123 Dobra uwaga, choć zapewne ta, która została już dokonana przez eijeze dwa lata wcześniej (patrz pierwszy komentarz powyżej).
MadHatter
2

Odkryłem, że istnieje kilka prostych zmian, które sprawiają, że skrypt działa. Dodałem także kilka testów, aby po utworzeniu klucza został on automatycznie przetestowany.

Usunąłem również hasło, aby testy kluczy mogły zostać zautomatyzowane.

#!/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
źródło
1

Opracowano to w ramach generowania kluczy do automatycznej instalacji aplikacji. Zainstalowanie i uruchomienie pakietu „ rngd ” w celu wygenerowania entroy naprawi problem. Prosty w instalacji i obsłudze.

Oto kod .

  • Uruchamia rngd ( /dev/hwrandomdomyślnie, ale można go modyfikować), aby zapewnić źródło entropii
  • Kopiuje prosty szablon (zamień adres e-mail i nazwę szablonu jinja na to, co chcesz)
  • generuje klucz za pomocą gpg
  • importuje go do lokalnego klucza
xddsg
źródło
Podany przykładowy kod urandomjest używany jako źródło, które jest odradzane. 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 używa /dev/hwrandomdomyślnie i można go modyfikować. Zobacz stronę podręcznika man.
xddsg,
Zgadza się, stwierdziłem, że w kodzie, który z nim łączysz, wyraźnie używasz urandomi że jest to odradzane.
keyneom
-1

Oto jeden, którego możesz użyć, ale zaleciłbym uruchomienie tego skryptu w nowym terminalu, aby nie wpłynął na twój obecny. Ten skrypt będzie nadal generował entropię, utrzymując maszynę w stanie zajętości i zatrzymując się w nieskończonej pętli, dopóki użytkownik nie wyjdzie ze skryptu. Interakcja użytkownika nie jest konieczna do momentu wygenerowania klucza. Wszystko, co robi skrypt, to lista plików na zawsze.

Wygenerowanie może zająć kilka minut (czasem 10+) w zależności od komputera i wielkości klucza, ale dobrze jest nie musieć z nim współdziałać.

#!/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
Entropia
źródło
Wyszukiwanie w systemie plików nie generuje prawdziwie bezpiecznego źródła entropii, ponieważ jego zachowanie jest przewidywalne i odtwarzalne.
Joffrey,