Назад | Перейти на главную страницу

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

Я нашел в 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 создаются в домашнем каталоге, но они пусты.

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

Версии:

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

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

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

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

  3. обеспечение компьютера другим физическим источником полноценной энтропии. Такие устройства, как Ключ энтропии или 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 исправит вашу проблему. Проста в установке и использовании.

Вот код.

  • Запускает rngd (/dev/hwrandom по умолчанию, но можно изменять), чтобы обеспечить источник энтропии
  • Копирует простой шаблон поверх (замените адрес электронной почты и имя шаблона jinja на то, что хотите)
  • генерирует ключ с помощью gpg
  • импортирует его в локальную связку ключей

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

Генерация может занять несколько минут (иногда 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