Używając OpenSSL, co oznacza „niezdolność do zapisu„ stanu losowego ””?

407

Generuję samopodpisany certyfikat SSL w celu ochrony sekcji administracyjnej mojego serwera i wciąż otrzymuję ten komunikat z OpenSSL:

nie można zapisać „stanu losowego”

Co to znaczy?

To jest na serwerze Ubuntu. Zaktualizowałem libssl, aby naprawić niedawną lukę w zabezpieczeniach .

Luke Francl
źródło

Odpowiedzi:

555

W praktyce najczęstszą przyczyną tego zjawiska jest to, że plik .rnd w twoim katalogu domowym jest własnością root, a nie konta. Szybka poprawka:

sudo rm ~/.rnd

Aby uzyskać więcej informacji, oto wpis z OpenSSL FAQ :

Czasami narzędzie wiersza polecenia openssl nie przerywa działania z komunikatem o błędzie „PRNG nie został zaszczepiony”, ale skarży się, że „nie jest w stanie zapisać„ stanu losowego ”. Ten komunikat odnosi się do domyślnego pliku inicjującego (patrz poprzednia odpowiedź). Możliwym powodem jest brak domyślnej nazwy pliku, ponieważ nie jest ustawiony ani RANDFILE, ani HOME. (W tym przypadku wersje do 0.9.6 używały pliku „.rnd” w bieżącym katalogu, ale zmieniło się to w wersji 0.9.6a.)

Więc sprawdziłbym RANDFILE, HOME i uprawnienia do zapisu w tych miejscach w systemie plików.

Jeśli wszystko wydaje się być w porządku, możesz spróbować biegać strace i zobaczyć, co się właściwie dzieje.

Ville Laurikari
źródło
42
Mój system dawał mi ten problem, ponieważ plik „.rnd” był własnością użytkownika root, a nie mojego użytkownika. Szybko sudo chown user:user ~/.rndsprawiło, że wszystko się udało.
HalfBrian
1
Miałem ten sam problem co OP. Zrobiłem to sudoi zadziałało. Ale dlaczego nadal mam .rndkatalog w katalogu $ HOME po utworzeniu samopodpisanego certyfikatu?
Luc M
3
Tak, jeśli uruchamiasz z serwera php, użytkownik to www-data i powinieneś dodać „eksport” przed każdym openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
diyism
2
Jeśli używasz języka skryptowego, takiego jak PHP, do wywoływania openssl jako www-data, możesz rozwiązać ten problem, tworząc go /var/www/.rndi zmieniając www-data. (Zakładając, że /var/wwwjest www-datato folder domowy, który znajduje się w większości systemów. Możesz sprawdzić www-datafolder domowy za pomocą cat /etc/passwd | grep www-data)
Nick
1
Korzystałem z systemu Windows - oczywiście musiałem uruchomić monit CMD jako administrator! W ten sposób udało się obejść ten problem.
NickBeaugié
264

Wiem, że to pytanie dotyczy systemu Linux, ale w systemie Windows miałem ten sam problem. Okazuje się, że musisz uruchomić wiersz polecenia w trybie „Uruchom jako administrator”, aby działał. W przeciwnym razie otrzymasz to samo: nie można zapisać błędu „stan losowy”.

Dom na plaży
źródło
13
Pracuję w systemie Windows jako administrator, ale nadal
pojawia się
6
Bycie administratorem na komputerze i używanie „Uruchom jako administrator” są różne. „Uruchom jako administrator” zmusza program do działania jako administrator, w przeciwnym razie nawet jeśli jesteś administratorem, monit zostanie uruchomiony z poświadczeniem bezpieczeństwa innym niż administrator.
Beachhouse
66
Jeśli pracujesz w trybie administratora i nadal pojawia się komunikat „Nie można zapisać„ stanu losowego ””, innym rozwiązaniem jest set RANDFILE=.rndwykonanie go openssl.
jevon 16.04.13
3
W Powershell jest to $env:RANDFILE=".rnd"raczej niż set RANDFILE=.rnd.
x5657,
Jaki jest minus NIE robienia tego?
StanTastic
41

Jeszcze jeden problem na platformie Windows, upewnij się, że uruchamiasz wiersz polecenia jako użytkownik administracyjny!

Nie wiem ile razy mnie to ugryzło ...

joel
źródło
jak inni sugerują ustawienie tego zestawu RANDFILE = .rnd pracował dla mnie bez robienia linii cmd z Administratorem
Svetoslav Marinov
16

Najwyraźniej musiałem uruchomić OpenSSL jako root, aby mieć uprawnienia do pliku inicjującego.

Luke Francl
źródło
16
Bardziej prawdopodobne jest, że raz uruchomiłeś go jako root, po czym plik .rnd w twoim katalogu domowym został utworzony z uprawnieniami ustawionymi tylko dla roota. Zdarzyło mi się to jakiś czas temu. Usunięcie .rnd rozwiązało problem.
fotNelton,
12

Miałem to samo na serwerze Windows. Potem wymyśliłem, zmieniając to, vars.batco:

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

następnie powtórz od początku i wszystko powinno być w porządku.

Jusuf
źródło
to było to! dzięki. dokonałem tej zmiany pomiędzy poleceniami „init-config” i „vars”, z instrukcji (tutaj: openvpn.net/index.php/open-source/documentation/howto.html#pki ). musi być, ponieważ zainstalowałem wersję 32-bitową (którą preferuję).
symbiont
4
To załatwiło sprawę i nie musiałem biegać jako administrator. Dzięki! W rzeczywistości po prostu użyłemset HOME=.
Synetech
6

Problemem było to, że miałem .rnd w moim katalogu domowym, ale był własnością root. Usunięcie go i ponowne uruchomienie polecenia openssl naprawiło to.

Zds
źródło
5

Powinieneś ustawić zmienną środowiskową $ RANDFILE i / lub utworzyć plik $ HOME / .rnd. ( OpenSSL FAQ ). (Oczywiście powinieneś mieć prawa do tego pliku. Inne odpowiedzi tutaj są na ten temat. Ale najpierw powinieneś mieć plik i odniesienie do niego.)

Do wersji 0.9.6 OpenSSL zapisał plik inicjujący w bieżącym katalogu w pliku „.rnd”. W wersji 0.9.6a nie ma domyślnego pliku inicjującego. OpenSSL 0.9.6b i nowsze będą zachowywać się podobnie jak 0.9.6a, ale użyją domyślnej wartości „C: \” dla HOME w systemach Windows, jeśli zmienna środowiskowa nie została ustawiona.

Jeśli domyślny plik inicjujący nie istnieje lub jest za krótki, może pojawić się komunikat o błędzie „PRNG nie został zaszczepiony”.

Zmienna środowiskowa $ RANDFILE i $ HOME / .rnd są używane tylko przez narzędzia wiersza poleceń OpenSSL. Aplikacje korzystające z biblioteki OpenSSL mają własne opcje konfiguracji do określania źródła entropii, sprawdź dokumentację dołączoną do aplikacji.

Gangnus
źródło
1

Natknąłem się dziś na ten problem na AWS Lambda. Utworzyłem zmienną środowiskową RANDFILE = /tmp/.random

To załatwiło sprawę.

Guilherme Mussi
źródło