Як генерувати 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'

Але тоді це просто зависає.

Коли я перевіряю, в середній час, дерево дерева для цього користувача, я бачу:

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

Відповіді:


4

Цілком ймовірно, що у вас закінчується ентропія. Для генерації ключів потрібно багато дуже якісних випадкових чисел; без активності користувача, щоб забезпечити якісну випадковість комп'ютеру, пул ентропій вичерпується поколінням, а процес генерації просто зависає, чекаючи, коли пул поповниться.

Ваш вибір, з метою підвищення задовільності, є

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

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

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

Редагувати : mzhaase звертає мою увагу в коментарі до цієї статті про / dev / urandom vs. / dev / random (за що велике спасибі, це відмінна стаття!) І ставить під сумнів мою неприязнь до використання urandomключів. Насправді стаття не говорить про те, що два джерела рівнозначні, і зазначає це

Linux / dev / urandom з радістю дає вам не настільки випадкові номери, перш ніж ядро ​​навіть отримало можливість зібрати ентропію. Коли це? При запуску системи завантажте комп'ютер.

Тобто, після завантаження, доки urandomPRNG не буде ініціалізований з достатньою ентропією, використовувати його для генерації ключів справді небезпечно. Це може зайняти деякий час, особливо на сервісі без нагляду, без голови, і ми не знаємо, коли буде досягнуто поріг, оскільки система нам прямо не каже.

Тепер, якщо я /dev/randomготовий видати номери, я можу з розумом зробити висновок, що пул ентропії є досить глибоким, що urandomбуде належним чином ініціалізовано. Але якщо мені доведеться перевіряти /dev/randomблокування перед кожним використанням urandom(зважаючи на те, що я генерую ключі рідше, ніж перезавантажую, швидше за все, це буде так), я можу просто використати цифри, /dev/randomщоб створити свої ключі.


2
Тобто / була проблема. Додано демона демонів, і тепер він працює чудово - генерація ключів за ~ 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 install hasged, а потім запустіть: haveged
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
  • імпортує його до локальних брелоків

У наданому зразку код 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

Знаходження у файловій системі не породжує справді безпечного джерела ентропії, оскільки її поведінка передбачувана та відтворювана.
Джоффрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.