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 .

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.


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”.


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 ...


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.


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.


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.


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.


1

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

To załatwiło sprawę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.