Я нашел в 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 на использование неблокирующего генератора псевдослучайных чисел, что было бы самым неразумным (хотя см. ниже),
использование программного решения для получения большей энтропии из существующего состояния системы (ядро, как известно, консервативно относится к тому, сколько энтропии оно готово получить из состояния системы, особенно если это состояние не имеет прямого человеческого участия, например, тайминги CPU или NIC); как вы указали, кованый одно из таких решений, или
обеспечение компьютера другим физическим источником полноценной энтропии. Такие устройства, как Ключ энтропии или OneRNG может удовлетворить это требование (я не связан ни с одним из продуктов, кроме того, что у меня есть ключ энтропии, и я очень им доволен).
редактировать: mzhaase обращает мое внимание в комментарии к эта статья о / dev / urandom vs. / dev / random (за что большое спасибо, это отличная статья!) и не согласен с тем, что я не люблю использовать urandom
для создания ключей. Фактически, в статье не говорится, что эти два источника эквивалентны, и отмечается, что
Linux / dev / urandom с радостью дает вам не очень случайные числа еще до того, как ядро получит возможность собирать энтропию. Когда это? При запуске системы загрузка компьютера.
То есть, после загрузки, пока urandom
ГПСЧ инициализирован с достаточной энтропией, использовать его для генерации ключей действительно небезопасно. Это может занять некоторое время, особенно на необслуживаемом сервере без головы, и мы не знаем, когда был достигнут порог, потому что система явно не сообщает нам об этом.
Сейчас если /dev/random
готов выпустить числа, я могу разумно сделать вывод, что пул энтропии достаточно глубок, чтобы urandom
будут правильно инициализированы. Но если мне нужно проверить /dev/random
для блокировки перед каждым использованием urandom
(учитывая, что я генерирую ключи реже, чем перезагружаюсь, вероятно, так и есть), я мог бы просто использовать числа из /dev/random
для генерации моих ключей.
Я обнаружил, что есть несколько простых изменений, которые заставляют ваш скрипт работать. Я также включил несколько тестов, чтобы после создания ключа он был автоматически проверен.
Я также удалил пароль, чтобы можно было автоматизировать ключевые тесты.
#!/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
Разработал это как часть генерации ключей для автоматической установки приложения. Установка и запуск 'rngd'пакет для генерации Entroy исправит вашу проблему. Проста в установке и использовании.
/dev/hwrandom
по умолчанию, но можно изменять), чтобы обеспечить источник энтропииВот тот, который вы могли бы использовать, но я бы рекомендовал запустить этот скрипт в новом терминале, чтобы не повлиять на ваш текущий. Этот сценарий будет продолжать генерировать энтропию, удерживая машину занятой и застревая в бесконечном цикле, пока пользователь не выйдет из сценария. До генерации ключа взаимодействие с пользователем не требуется. Все, что делает сценарий, - это список файлов навсегда.
Генерация может занять несколько минут (иногда 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