Как создать ключ gpg без взаимодействия с пользователем?

13

Я нашел в https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation метод генерации ключей gpg без взаимодействия с пользователем, но это не так похоже на работу.

Мой сценарий:

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

Когда я запускаю его, он показывает:

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

Но тогда это просто зависает.

Когда я проверяю ps-дерево для этого пользователя, я вижу:

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 нет упоминания об агенте, и я понятия не имею, что он пытается сделать.

Файлы foo.pub/foo.sec создаются в домашнем каталоге, но они пусты.

Что мне не хватает? Как создать ключ без какого-либо взаимодействия с пользователем?

Версии:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2
eijeze
источник

Ответы:

4

Вполне вероятно, что у вас заканчивается энтропия. Генерация ключей требует много очень качественных случайных чисел; без активности пользователя по обеспечению высокого качества случайности компьютера пул энтропии истощается генерацией, а процесс генерации просто зависает, ожидая пополнения пула.

Ваш выбор, в порядке увеличения удовлетворенности,

  1. реконфигурирование gpg для использования неблокирующего генератора псевдослучайных чисел, что было бы наиболее неразумно (хотя см. ниже),

  2. использование программного решения для получения большей энтропии из существующего состояния системы (ядро общеизвестно консервативно оценивает, сколько энтропии оно готово извлечь из состояния системы, особенно когда это состояние не имеет прямого человеческого воздействия, например, времени CPU или NIC); как вы указали, haveged одно такое решение, или

  3. обеспечение компьютера другим физическим источником полноценной энтропии. Такие устройства, как Entropy Key или OneRNG, могут удовлетворить это требование (я не связан ни с одним из продуктов, за исключением того, что у меня есть Entropy Key, и я очень доволен им).

Редактировать : mzhaase обращает мое внимание в комментарии к этой статье на / dev / urandom vs. / dev / random (за что большое спасибо, это отличная статья!) И не согласен с моим нежеланием использовать urandomдля создания ключей. На самом деле, в статье не говорится, что эти два источника эквивалентны, и отмечает, что

Linux / dev / urandom с радостью дает вам не очень случайные числа, прежде чем ядро ​​получит шанс собрать энтропию. Когда это? При запуске системы, загрузка компьютера.

То есть после загрузки, пока urandomPRNG не будет инициализирован с достаточной энтропией, использовать его для генерации ключа действительно небезопасно. Это может занять некоторое время, особенно на необслуживаемом, безголовом сервере, и мы не знаем, когда был достигнут порог, потому что система явно не сообщает нам.

Теперь, если /dev/randomон готов к выпуску чисел, я могу сделать разумный вывод, что энтропийный пул достаточно глубок, чтобы urandomего правильно инициализировать. Но если мне придется проверять /dev/randomблокировку перед каждым использованием urandom(что, учитывая, что я генерирую ключи реже, чем перезагружаюсь, вероятно, имеет место), я мог бы просто использовать числа из /dev/randomдля генерации моих ключей.

Безумный Шляпник
источник
2
Это была проблема. Добавлен демон hasged, и теперь он работает нормально - генерация ключей за ~ 0,7 с.
eijeze
То, что PRNG не так хороши, это миф. Фактически и / dev / random, и / dev / urandom используют один и тот же PRNG. Вы не требуете истинной случайности для алгоритмов, которые безопасны только в вычислительном отношении (и ни / dev / random, ни / dev / urandom на самом деле не могут дать вам истинную случайность: для этого вам нужно измерить фактически случайные вещи). Единственная криптография, которая требует истинной случайности, - это информационно защищенные алгоритмы, такие как одноразовая клавиатура. Эта ссылка подробно рассказывает об этом: 2uo.de/myths-about-urandom
mzhaase
@mzhaase как ни странно, я наткнулся на эту ссылку и прочитал ее ранее на этой неделе. Я отредактирую свой ответ выше, чтобы отразить статью, хотя я не полностью согласен с этим. Я также отмечаю, что, как ни странно, моя система, вероятно, получает истинную случайность /dev/random(и, следовательно, /dev/urandomпочти непредсказуемые числа почти всегда), потому что у меня есть аппаратное устройство, которое использует квантовое туннелирование для генерации энтропии, физически подключенной к моему серверу (см. над).
MadHatter
1
хорошо работает, ключ генерируется за 1 сек. Просто apt-get установите hasged, а затем запустите: hasged
waza123
@ waza123 Хороший вопрос, хотя, возможно, тот, который был сделан eijeze два года назад (см. первый комментарий выше).
MadHatter
2

Я обнаружил, что есть несколько простых изменений, которые заставят ваш скрипт работать. Я также включил несколько тестов, чтобы после создания ключа он автоматически тестировался.

Я также удалил пароль, чтобы ключевые тесты можно было автоматизировать.

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

Это было сделано как часть генерации ключей для автоматической установки приложения. Установка и запуск пакета ' rngd ' для генерации entroy решит вашу проблему. Прост в установке и использовании.

Вот код .

  • Запускает rngd ( /dev/hwrandomпо умолчанию, но изменяемый), чтобы обеспечить источник энтропии
  • Копирует простой шаблон поверх (замените шаблон электронной почты и имя jinja на то, что вы хотите)
  • генерирует ключ используя gpg
  • импортирует его в локальный брелок
xddsg
источник
В приведенном примере кода urandomиспользуется в качестве источника, что не рекомендуется. 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/hwrandomпо умолчанию и может быть изменено. Смотрите справочную страницу.
xddsg
Правильно, я заявлял, что в коде, который вы ссылаетесь, он явно используется, urandomи это не рекомендуется.
Keyneom
-1

Вот тот, который вы могли бы использовать, но я бы порекомендовал запустить этот скрипт в новом терминале, чтобы он не влиял на ваш текущий. Этот сценарий будет продолжать генерировать энтропию, оставляя машину занятой и зацикливаясь на бесконечном цикле, пока пользователь не выйдет из сценария. Взаимодействие с пользователем не требуется до генерации ключа. Все, что делает скрипт - это список файлов навсегда.

Генерирование может занять несколько минут (иногда более 10) в зависимости от вашей машины и размера ключа, но хорошо, что вам не нужно с ним взаимодействовать.

#!/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
Энтропия
источник
Выполнение поиска в файловой системе не создает действительно безопасного источника энтропии, поскольку ее поведение предсказуемо и воспроизводимо.
Джоффри