Usando OpenSSL, ¿qué significa "incapaz de escribir 'estado aleatorio'"?

407

Estoy generando un certificado SSL autofirmado para proteger la sección de administración de mi servidor, y sigo recibiendo este mensaje de OpenSSL:

incapaz de escribir 'estado aleatorio'

¿Qué significa esto?

Esto está en un servidor Ubuntu. He actualizado libssl para corregir la vulnerabilidad de seguridad reciente .

Luke Francl
fuente

Respuestas:

556

En la práctica, la razón más común para que esto suceda parece ser que el archivo .rnd en su directorio personal es propiedad de root en lugar de su cuenta. La solución rápida:

sudo rm ~/.rnd

Para obtener más información, aquí está la entrada de las preguntas frecuentes de OpenSSL :

A veces, la utilidad de línea de comandos openssl no aborta con un mensaje de error "PRNG no sembrado", pero se queja de que es "incapaz de escribir 'estado aleatorio'". Este mensaje hace referencia al archivo de inicialización predeterminado (consulte la respuesta anterior). Una posible razón es que no se conoce un nombre de archivo predeterminado porque ni RANDFILE ni HOME están configurados. (Las versiones hasta 0.9.6 usaron el archivo ".rnd" en el directorio actual en este caso, pero esto ha cambiado con 0.9.6a.)

Entonces verificaría RANDFILE, HOME y permisos para escribir en esos lugares en el sistema de archivos.

Si todo parece estar en orden, puede intentar correr con strace y ver qué está sucediendo exactamente.

Ville Laurikari
fuente
42
Mi sistema me estaba dando este problema porque el archivo ".rnd" era propiedad de root en lugar de mi usuario. Un rápido sudo chown user:user ~/.rndhizo que todo saliera bien.
HalfBrian
1
Tuve el mismo problema que OP. Hice la sudocosa y funcionó. Pero, ¿por qué todavía tengo un .rnddirectorio creado por root en mi $ HOME después de crear un certificado autofirmado?
Luc M
3
Sí, si ejecuta desde el servidor web php, el usuario es www-data, y debe agregar "exportar" antes de cada openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
diyism
2
Si está utilizando un lenguaje de secuencias de comandos como PHP para llamar a openssl como www-data, puede resolver esto creándolo /var/www/.rndy ajustándolo www-data. (Suponiendo que esa /var/wwwsea www-datala carpeta de inicio, que está en la mayoría de los sistemas. Puede verificar www-datala carpeta de inicio con cat /etc/passwd | grep www-data)
Nick
1
Estaba usando Windows, ¡por supuesto, necesitaba ejecutar el indicador CMD como administrador! Al hacerlo, solucioné este problema.
NickBeaugié
264

Sé que esta pregunta está en Linux, pero en Windows tuve el mismo problema. Resulta que debe iniciar el símbolo del sistema en modo "Ejecutar como administrador" para que funcione. De lo contrario, obtienes lo mismo: no se puede escribir el error de 'estado aleatorio'.

Casa en la playa
fuente
13
Me estoy ejecutando en Windows como administrador pero sigo recibiendo el error
Smalcat
66
Ser administrador en la máquina y usar "Ejecutar como administrador" son diferentes. "Ejecutar como administrador" obliga al programa a ejecutarse como administrador, de lo contrario, incluso si usted es un administrador, la solicitud se ejecutará con una autorización de seguridad no administrativa.
Beachhouse
67
Si está ejecutando en modo administrador y sigue recibiendo "No se puede escribir 'estado aleatorio'", otra solución es set RANDFILE=.rndantes de ejecutar openssl.
jevon
3
En Powershell esto es $env:RANDFILE=".rnd"más que set RANDFILE=.rnd.
x5657
¿Cuál es la desventaja de NO hacer eso?
StanTastic
41

¡Otro problema en la plataforma Windows, asegúrese de ejecutar su símbolo del sistema como usuario administrativo!

No sé cuántas veces esto me ha mordido ...

joel
fuente
1
como otros han sugerido configurar este conjunto RANDFILE = .rnd funcionó para mí sin hacer una línea cmd con el Administrador
Svetoslav Marinov
16

Aparentemente, necesitaba ejecutar OpenSSL como root para que tuviera permiso para el archivo inicial.

Luke Francl
fuente
16
Es más probable que una vez lo haya ejecutado como root, con lo cual el archivo .rnd en su directorio de inicio se creó con permisos establecidos solo para root. Esto me sucedió hace un tiempo. La eliminación de .rnd resolvió el problema.
fotNelton
13

Tuve lo mismo en el servidor de Windows. Entonces descubrí cambiando lo vars.batque es:

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

luego rehacer desde el principio y todo debería estar bien.

Jusuf
fuente
¡eso fue todo! Gracias. Hice este cambio justo entre los comandos "init-config" y "vars", a partir de las instrucciones (aquí: openvpn.net/index.php/open-source/documentation/howto.html#pki ). debe ser porque instalé la versión de 32 bits (que prefiero).
simbionte
44
Eso funcionó, y no tuve que correr como administrador. ¡Gracias! De hecho, simplemente uséset HOME=.
Synetech
6

El problema para mí fue que tenía .rnd en mi directorio personal pero era propiedad de root. Eliminarlo y volver a emitir el comando openssl solucionó esto.

Zds
fuente
6

Debe establecer la variable de entorno $ RANDFILE y / o crear el archivo $ HOME / .rnd. ( Preguntas frecuentes de OpenSSL ). (Por supuesto, debe tener derechos sobre ese archivo. Otras respuestas aquí son sobre eso. Pero primero debe tener el archivo y una referencia a él).

Hasta la versión 0.9.6 OpenSSL escribió el archivo inicial en el directorio actual en el archivo ".rnd". En la versión 0.9.6a no tiene un archivo de inicialización predeterminado. OpenSSL 0.9.6by posterior se comportará de manera similar a 0.9.6a, pero usará un valor predeterminado de "C: \" para HOME en los sistemas Windows si la variable de entorno no se ha configurado.

Si el archivo de inicialización predeterminado no existe o es demasiado corto, puede aparecer el mensaje de error "PRNG no sembrado".

La variable de entorno $ RANDFILE y $ HOME / .rnd solo son utilizados por las herramientas de línea de comandos de OpenSSL. Las aplicaciones que usan la biblioteca OpenSSL proporcionan sus propias opciones de configuración para especificar la fuente de entropía, consulte la documentación que viene con la aplicación.

Gangnus
fuente
2

Me he encontrado con este problema hoy en AWS Lambda. Creé una variable de entorno RANDFILE = /tmp/.random

Eso hizo el truco.

Guilherme Mussi
fuente