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 .

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.


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


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


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.


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.


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


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.


2

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

Eso hizo el truco.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.