Usando OpenSSL cosa significa "incapace di scrivere" stato casuale "?


407

Sto generando un certificato SSL autofirmato per proteggere la sezione di amministrazione del mio server e continuo a ricevere questo messaggio da OpenSSL:

impossibile scrivere "stato casuale"

Cosa significa questo?

Questo è su un server Ubuntu. Ho aggiornato libssl per correggere la recente vulnerabilità di sicurezza .

Risposte:


556

In pratica, il motivo più comune per cui questo accade sembra essere che il file .rnd nella tua home directory sia di proprietà di root piuttosto che del tuo account. La soluzione rapida:

sudo rm ~/.rnd

Per ulteriori informazioni, ecco la voce dalle FAQ di OpenSSL :

A volte l'utilità della riga di comando openssl non si interrompe con un messaggio di errore "PRNG non seeded", ma si lamenta che non è "in grado di scrivere 'stato casuale'". Questo messaggio fa riferimento al file di seeding predefinito (vedere la risposta precedente). Un possibile motivo è che non è noto alcun nome file predefinito perché non è impostato né RANDFILE né HOME. (Le versioni fino alla 0.9.6 hanno usato il file ".rnd" nella directory corrente in questo caso, ma questo è cambiato con 0.9.6a.)

Quindi vorrei controllare RANDFILE, HOME e le autorizzazioni per scrivere in quei posti nel filesystem.

Se tutto sembra essere in ordine, potresti provare a correre con Strace e vedere cosa sta succedendo esattamente.


42
Il mio sistema mi stava dando questo problema perché il file ".rnd" era di proprietà di root anziché del mio utente. In breve tempo sudo chown user:user ~/.rndtutto ha funzionato.
HalfBrian,

1
Ho avuto lo stesso problema di OP. Ho fatto la sudocosa e ha funzionato. Ma perché ho ancora una .rnddirectory nascosta da root nel mio $ HOME dopo aver creato un certificato autofirmato?
Luc M

3
Sì, se corri dal web server php, l'utente è www-data e dovresti aggiungere "export" prima di ogni openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
diyismo,

2
Se stai usando un linguaggio di scripting come PHP per chiamare openssl come www-data, puoi risolverlo creando /var/www/.rnde chown www-data. (Supponendo che /var/wwwsia www-datala cartella principale, che è presente sulla maggior parte dei sistemi. Puoi controllare www-datala cartella principale con cat /etc/passwd | grep www-data)
Nick,

1
Stavo usando Windows - ovviamente, dovevo eseguire il prompt CMD come amministratore! In questo modo, aggirato questo problema.
NickBeaugié,

264

So che questa domanda è su Linux, ma su Windows ho avuto lo stesso problema. Si scopre che è necessario avviare il prompt dei comandi in modalità "Esegui come amministratore" affinché funzioni. Altrimenti ottieni lo stesso: impossibile scrivere l'errore 'stato casuale'.


13
Sto correndo su Windows come amministratore ma continuo a ricevere l'errore
Smalcat,

6
Essere un amministratore sulla macchina e usare "Esegui come amministratore" sono diversi. "Esegui come amministratore" forza l'esecuzione del programma come amministratore, altrimenti anche quando si è un amministratore, il prompt verrà eseguito con un nulla osta di sicurezza non amministratore.
Beachhouse,

67
Se si esegue in modalità amministratore e si continua a ricevere "Impossibile scrivere 'stato casuale'", un'altra soluzione è set RANDFILE=.rndprima di eseguire openssl.
jevon,

3
In Powershell questo è $env:RANDFILE=".rnd"piuttosto che set RANDFILE=.rnd.
x5657,

Qual è il lato negativo di NON farlo?
StanTastic,

41

Un altro problema sulla piattaforma Windows, assicurati di eseguire il prompt dei comandi come Utente amministrativo!

Non so quante volte questo mi ha morso ...


1
come altri hanno suggerito di impostare questo set RANDFILE = .rnd ha funzionato per me senza fare la linea cmd con l'amministratore
Svetoslav Marinov

16

Apparentemente, avevo bisogno di eseguire OpenSSL come root per avere l'autorizzazione al file seeding.


16
È più probabile che una volta sia stato eseguito come root, dopo di che il file .rnd nella directory home è stato creato con le autorizzazioni impostate solo per root. Questo è successo a me qualche tempo fa. La cancellazione di .rnd ha risolto il problema.
fotNelton,

13

Ho avuto la stessa cosa su Windows Server. Poi ho capito cambiando il vars.batche è:

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

quindi ripetere dall'inizio e tutto dovrebbe andare bene.


era quello! Grazie. ho fatto questo cambiamento tra i comandi "init-config" e "vars", dalle istruzioni (qui: openvpn.net/index.php/open-source/documentation/howto.html#pki ). deve essere perché ho installato la versione a 32 bit (che preferisco).
simbion

4
Questo ha funzionato e non ho dovuto correre come amministratore. Grazie! In effetti, ho semplicemente usatoset HOME=.
Synetech

6

Il problema per me era che avevo .rnd nella mia home directory ma era di proprietà di root. L'eliminazione e la riemissione del comando openssl hanno risolto questo problema.


6

È necessario impostare la variabile di ambiente $ RANDFILE e / o creare il file $ HOME / .rnd. ( Domande frequenti su OpenSSL ). (Certo, dovresti avere i diritti su quel file. Altre risposte qui riguardano questo. Ma prima dovresti avere il file e un riferimento ad esso.)

Fino alla versione 0.9.6 OpenSSL ha scritto il file seeding nella directory corrente nel file ".rnd". Alla versione 0.9.6a non hai un file di seeding predefinito. OpenSSL 0.9.6b e successivi si comporteranno in modo simile a 0.9.6a, ma utilizzerà un valore predefinito di "C: \" per HOME su sistemi Windows se la variabile di ambiente non è stata impostata.

Se il file di seeding predefinito non esiste o è troppo corto, potrebbe essere visualizzato il messaggio di errore "PRNG non seeded".

La variabile d'ambiente $ RANDFILE e $ HOME / .rnd sono utilizzati solo dagli strumenti della riga di comando di OpenSSL. Le applicazioni che utilizzano la libreria OpenSSL forniscono le proprie opzioni di configurazione per specificare l'origine entropia, consultare la documentazione fornita con l'applicazione.


2

Oggi ho riscontrato questo problema su AWS Lambda. Ho creato una variabile d'ambiente RANDFILE = /tmp/.random

Questo ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.