Используя OpenSSL, что означает «неспособный написать« случайное состояние »»?

407

Я создаю самозаверяющий сертификат SSL для защиты раздела администратора моего сервера, и я продолжаю получать это сообщение от OpenSSL:

невозможно написать «случайное состояние»

Что это значит?

Это на сервере Ubuntu. Я обновил libssl, чтобы исправить недавнюю уязвимость безопасности .

Люк Франкл
источник

Ответы:

556

На практике наиболее распространенной причиной этого является то, что файл .rnd в вашем домашнем каталоге принадлежит пользователю root, а не вашей учетной записи. Быстрое решение:

sudo rm ~/.rnd

Для получения дополнительной информации, вот запись из OpenSSL FAQ :

Иногда утилита командной строки openssl не прерывает работу с сообщением об ошибке «PRNG not seded», но жалуется, что «не может написать« случайное состояние »». Это сообщение относится к файлу заполнения по умолчанию (см. Предыдущий ответ). Возможная причина в том, что имя файла по умолчанию неизвестно, поскольку не заданы ни RANDFILE, ни HOME. (Версии до 0.9.6 использовали файл ".rnd" в текущем каталоге в этом случае, но это изменилось с 0.9.6a.)

Поэтому я бы проверил RANDFILE, HOME и разрешения на запись в эти места в файловой системе.

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

Вилле Лаурикари
источник
42
Моя система давала мне эту проблему, потому что файл ".rnd" принадлежал пользователю root, а не моему пользователю. Быстро sudo chown user:user ~/.rndзаставил все получиться.
HalfBrian
1
У меня была та же проблема, что и у ОП. Я сделал это sudo, и это сработало. Но почему у меня все еще есть .rndкаталог, помеченный root в моем $ HOME после создания самозаверяющего сертификата?
Люк М
3
Да, если вы запускаете с веб-сервера php, пользователь является www-data, и вы должны добавлять «export» перед каждым openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
diyism
2
Если вы используете язык сценариев, такой как PHP, для вызова openssl как www-данных, вы можете решить это, создав /var/www/.rndи ограничив его www-data. (Предполагая, что /var/wwwэто www-dataдомашняя папка, которая есть на большинстве систем. Вы можете проверить www-dataдомашнюю папку с ней cat /etc/passwd | grep www-data)
Ник
1
Я использовал Windows - конечно, мне нужно было запустить приглашение CMD от имени администратора! Сделав так, обошёл эту проблему.
NickBeaugié
264

Я знаю, что этот вопрос в Linux, но в Windows у меня была такая же проблема. Оказывается, вы должны запустить командную строку в режиме «Запуск от имени администратора», чтобы она работала. В противном случае вы получите то же самое: невозможно написать ошибку «случайное состояние».

Пляжный домик
источник
13
Я работаю в Windows от имени администратора, но все еще получаю сообщение об ошибке
Smalcat
6
Быть администратором на машине и использовать «Запуск от имени администратора» - это другое. «Запуск от имени администратора» заставляет программу работать от имени администратора, в противном случае, даже если вы являетесь администратором, приглашение будет запускаться с разрешением без прав администратора.
Beachhouse
67
Если вы работаете в режиме администратора и по- прежнему получаете сообщение «Невозможно записать« случайное состояние »», другое решение - выполнить set RANDFILE=.rndперед выполнением openssl.
Джевон
3
В Powershell это $env:RANDFILE=".rnd"скорее чем set RANDFILE=.rnd.
x5657
В чем недостаток НЕ делать это?
StanTastic
41

Еще одна проблема на платформе Windows: убедитесь, что вы запускаете командную строку от имени администратора!

Я не знаю, сколько раз это укусило меня ...

Joel
источник
1
как другие предложили установить этот набор RANDFILE = .rnd работал для меня, не делая строку cmd с администратором
Святослав Маринов
16

Очевидно, мне нужно было запустить OpenSSL от имени пользователя root, чтобы у него были права доступа к файлу заполнения.

Люк Франкл
источник
16
Скорее всего, вы однажды запустили его как root, после чего файл .rnd в вашем домашнем каталоге был создан с разрешениями, установленными только для root. Это случилось со мной некоторое время назад. Удаление .rnd решило проблему.
Фотнелтон
13

У меня было то же самое на сервере Windows. Затем я понял, изменив vars.batчто:

set HOME=C:\Program Files (x86)\OpenVPN\easy-rsa

затем повторите с начала и все должно быть хорошо.

Jusuf
источник
это было это! Спасибо. я сделал это изменение прямо между командами "init-config" и "vars" из инструкций (здесь: openvpn.net/index.php/open-source/documentation/howto.html#pki ). должно быть потому, что я установил 32-битную версию (которую я предпочитаю).
симбионт
4
Это сделало свое дело, и мне не нужно было работать от имени администратора. Спасибо! На самом деле я просто использовалset HOME=.
Synetech
6

Проблема для меня заключалась в том, что у меня был .rnd в моем домашнем каталоге, но он принадлежал пользователю root. Удаление и повторный ввод команды openssl исправили это.

ЦУС
источник
6

Вам следует установить переменную среды $ RANDFILE и / или создать файл $ HOME / .rnd. ( OpenSSL FAQ ). (Конечно, у вас должны быть права на этот файл. Другие ответы здесь об этом. Но сначала у вас должен быть файл и ссылка на него.)

До версии 0.9.6 OpenSSL записывал файл заполнения в текущий каталог в файл ".rnd". В версии 0.9.6a у вас нет файла заполнения по умолчанию. OpenSSL 0.9.6b и выше будет вести себя аналогично 0.9.6a, но будет использовать значение по умолчанию «C: \» для HOME в системах Windows, если переменная окружения не была установлена.

Если файл заполнения по умолчанию не существует или является слишком коротким, может появиться сообщение об ошибке «PRNG not seded».

Переменная среды $ RANDFILE и $ HOME / .rnd используются только инструментами командной строки OpenSSL. Приложения, использующие библиотеку OpenSSL, предоставляют свои собственные параметры конфигурации для указания источника энтропии, пожалуйста, ознакомьтесь с документацией, прилагаемой к приложению.

Гангнус
источник
2

Сегодня я столкнулся с этой проблемой на AWS Lambda. Я создал переменную окружения RANDFILE = /tmp/.random

Это добилось цели.

Гильерме Мусси
источник