Wie kann ich einen GPG-Schlüssel ohne Benutzerinteraktion generieren?

12

Ich habe in https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation eine Methode gefunden, um GPG-Schlüssel ohne Benutzerinteraktion zu generieren, aber dies ist nicht der Fall scheinen zu funktionieren.

Mein Drehbuch lautet:

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

Wenn ich es starte, zeigt es:

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

Aber dann hängt es einfach.

Wenn ich in der Zwischenzeit den ps-Baum für diesen Benutzer überprüfe, sehe ich:

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

In ~ / .gnupg / gpg.conf wird Agent nicht erwähnt, und ich habe keine Ahnung, was er versucht zu tun.

Die Dateien foo.pub/foo.sec werden im Ausgangsverzeichnis erstellt, sind jedoch leer.

Was vermisse ich? Wie wird der Schlüssel ohne Benutzerinteraktion generiert?

Versionen:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2
eijeze
quelle

Antworten:

4

Es ist wahrscheinlich, dass Ihnen die Entropie ausgeht. Für die Schlüsselgenerierung sind viele sehr hochwertige Zufallszahlen erforderlich. Ohne die Aktivität des Benutzers, dem Computer qualitativ hochwertige Zufälligkeiten bereitzustellen, wird der Entropiepool durch die Generierung erschöpft, und der Generierungsprozess hängt nur noch und wartet darauf, dass der Pool wieder aufgefüllt wird.

Ihre Auswahlmöglichkeiten in der Reihenfolge zunehmender Zufriedenheit sind

  1. gpg neu konfigurieren, um den nicht blockierenden Pseudozufallszahlengenerator zu verwenden, was höchst unklug wäre (siehe unten),

  2. Verwenden einer Softwarelösung, um mehr Entropie aus dem vorhandenen Systemstatus abzuleiten (der Kernel ist bekanntermaßen konservativ in Bezug auf die Entropie, die er aus dem Systemstatus ableiten kann, insbesondere wenn dieser Status keine direkte menschliche Eingabe hat, z. B. CPU- oder NIC-Timings). Wie Sie bereits betont haben, ist Haveged eine solche Lösung

  3. Bereitstellung einer weiteren physikalischen Quelle für hochwertige Entropie für den Computer. Geräte wie der Entropy Key oder der OneRNG können diese Anforderung erfüllen (ich habe keine Verbindung zu einem der beiden Produkte, es sei denn, ich besitze einen Entropy Key und bin sehr zufrieden damit).

Edit : mzhaase macht mich in einem Kommentar zu diesem Artikel auf / dev / urandom vs. / dev / random aufmerksam (wofür ich mich bedanke , es ist ein ausgezeichneter Artikel!) Und widerspricht meiner Abneigung urandom, Schlüssel zu erstellen. Tatsächlich besagt der Artikel nicht, dass die beiden Quellen gleichwertig sind, und stellt fest, dass

Linux / dev / urandom gibt Ihnen glücklicherweise nicht so zufällige Zahlen, bevor der Kernel überhaupt die Chance hatte, Entropie zu sammeln. Wann ist das? Starten Sie den Computer beim Systemstart.

Das heißt, dass es nach dem Start, bis der urandomPRNG mit ausreichender Entropie initialisiert wurde, wirklich unsicher ist, ihn für die Schlüsselerzeugung zu verwenden. Dies kann eine Weile dauern, insbesondere auf einem unbeaufsichtigten, kopflosen Server, und wir wissen nicht, wann der Schwellenwert erreicht wurde, da das System uns dies nicht ausdrücklich mitteilt.

Wenn /dev/randomich nun bereit bin, Zahlen auszugeben, kann ich vernünftigerweise schließen, dass der Entropiepool tief genug ist, urandomum ordnungsgemäß initialisiert zu werden. Aber wenn ich /dev/randomvor jeder Verwendung auf Blockierung prüfen muss urandom(was wahrscheinlich der Fall ist, wenn ich weniger Schlüssel generiere als beim Neustart), kann ich auch einfach die Zahlen von verwenden /dev/random, um meine Schlüssel zu generieren.

MadHatter
quelle
2
Das ist / war das Problem. Haveged Daemon hinzugefügt, und jetzt funktioniert es gut - Schlüsselerzeugung in ~ 0,7s.
Eijeze
Dass PRNGs nicht so gut sind, ist ein Mythos. Tatsächlich verwenden sowohl / dev / random als auch / dev / urandom dasselbe PRNG. Sie benötigen keine echte Zufälligkeit für Algorithmen, die nur rechensicher sind (und weder / dev / random noch / dev / urandom können Ihnen tatsächlich echte Zufälligkeit geben: Sie müssen tatsächlich zufällige Dinge dafür messen). Die einzige Kryptographie, die echte Zufälligkeit erfordert, sind informationsgesicherte Algorithmen wie das One-Time-Pad. Dieser Link spricht ausführlich darüber: 2uo.de/myths-about-urandom
mzhaase
@mzhaase seltsamerweise bin ich auf diesen Link gestoßen und habe ihn Anfang dieser Woche gelesen. Ich werde meine Antwort oben bearbeiten, um den Artikel wiederzugeben, obwohl ich nicht ganz damit einverstanden bin. Ich stelle auch fest, dass mein System seltsamerweise wahrscheinlich echte Zufälligkeit erhält /dev/random(und daher /dev/urandomfast immer hochgradig unvorhersehbare Zahlen ), da ich ein Hardwaregerät habe, das Quantentunneling verwendet, um Entropie zu erzeugen, die physisch mit meinem Server verbunden ist (siehe über).
MadHatter
1
funktioniert einwandfrei, der schlüssel wird in 1 sek. generiert Einfach apt-get install haveged und dann run: haveged
waza123
@ Waza123 guter Punkt, obwohl wohl einer, der bereits von Eijeze vor zwei Jahren gemacht wurde (siehe den ersten Kommentar oben).
MadHatter
2

Ich habe festgestellt, dass es ein paar einfache Änderungen gibt, mit denen Ihr Skript funktioniert. Ich habe auch ein paar Tests beigefügt, damit der erstellte Schlüssel automatisch getestet wird.

Ich habe auch das Passwort entfernt, damit die Schlüsseltests automatisiert werden können.

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

Dies wurde im Rahmen der Erstellung von Schlüsseln für eine automatisierte Anwendungsinstallation herausgearbeitet. Das Installieren und Starten des ' rngd' -Pakets zur Erzeugung von entroy behebt Ihr Problem. Einfach zu installieren und zu benutzen.

Hier ist der Code .

  • Startet rngd ( /dev/hwrandomstandardmäßig, aber änderbar), um eine Entropiequelle bereitzustellen
  • Kopiert eine einfache Vorlage über (ersetzen Sie die E-Mail-Adresse und den Namen der Jinja-Vorlage durch die gewünschte)
  • generiert einen Schlüssel mit gpg
  • importiert es in den lokalen Schlüsselbund
xddsg
quelle
Im Beispiel wird der bereitgestellte Code urandomals Quelle verwendet, von der abgeraten wird. 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/hwrandomwird standardmäßig verwendet und kann geändert werden . Siehe Manpage.
xddsg
Richtig, ich habe gesagt, dass in dem Code, den Sie verlinkt haben, explizit verwendet wird urandomund dass dies nicht empfohlen wird.
Keyneom
-1

Hier ist eine, die Sie verwenden könnten, aber ich würde empfehlen, dieses Skript in einem neuen Terminal auszuführen, um Ihre aktuelle nicht zu beeinträchtigen. Dieses Skript erzeugt weiterhin Entropie, indem es den Computer beschäftigt und in einer Endlosschleife bleibt, bis ein Benutzer das Skript beendet. Erst nach der Schlüsselgenerierung ist eine Benutzerinteraktion erforderlich. Das Skript listet nur Dateien für immer auf.

Abhängig von Ihrem Computer und der Größe des Schlüssels kann es einige Minuten (manchmal mehr als 10) dauern, bis die Generierung abgeschlossen ist.

#!/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
Entropie
quelle
Ein Fund in einem Dateisystem ist keine wirklich sichere Entropiequelle, da sein Verhalten vorhersehbar und reproduzierbar ist.
Joffrey