En utilisant OpenSSL, que signifie «incapable d'écrire un« état aléatoire »»?


407

Je génère un certificat SSL auto-signé pour protéger la section d'administration de mon serveur et je reçois toujours ce message d'OpenSSL:

impossible d'écrire «état aléatoire»

Qu'est-ce que ça veut dire?

C'est sur un serveur Ubuntu. J'ai mis à jour libssl pour corriger la récente vulnérabilité de sécurité .

Réponses:


556

En pratique, la raison la plus courante de ce problème semble être que le fichier .rnd de votre répertoire personnel appartient à root plutôt qu'à votre compte. La solution rapide:

sudo rm ~/.rnd

Pour plus d'informations, voici l'entrée de la FAQ OpenSSL :

Parfois, l'utilitaire de ligne de commande openssl n'interrompt pas avec un message d'erreur "PRNG non prédéfini", mais se plaint qu'il est "incapable d'écrire 'état aléatoire'". Ce message fait référence au fichier d'amorçage par défaut (voir la réponse précédente). Une raison possible est qu'aucun nom de fichier par défaut n'est connu car ni RANDFILE ni HOME ne sont définis. (Les versions jusqu'à 0.9.6 utilisaient le fichier ".rnd" dans le répertoire courant dans ce cas, mais cela a changé avec 0.9.6a.)

Je vérifierais donc RANDFILE, HOME et les autorisations pour écrire à ces endroits dans le système de fichiers.

Si tout semble être en ordre, vous pouvez essayer de courir avec strace et voir ce qui se passe exactement.


42
Mon système me signalait ce problème car le fichier ".rnd" appartenait à root plutôt qu'à mon utilisateur. Un rapide sudo chown user:user ~/.rndtout a fonctionné.
HalfBrian

1
J'ai eu le même problème que OP. J'ai fait la sudochose et cela a fonctionné. Mais pourquoi ai-je toujours un .rndrépertoire racine par racine dans mon $ HOME après avoir créé un certificat auto-signé?
Luc M

3
Oui, si vous exécutez à partir du serveur Web php, l'utilisateur est www-data, et vous devez ajouter "export" avant chaque openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
diyism

2
Si vous utilisez un langage de script comme PHP pour appeler openssl en tant que www-data, vous pouvez résoudre ce problème en le créant /var/www/.rndet en le reprenant www-data. (En supposant que /var/wwwc'est www-datale dossier personnel de, qui se trouve sur la plupart des systèmes. Vous pouvez vérifier www-datale dossier personnel de cat /etc/passwd | grep www-data) avec
Nick

1
J'utilisais Windows - bien sûr, j'avais besoin d'exécuter l'invite CMD en tant qu'administrateur! Ce faisant, a contourné ce problème.
NickBeaugié

264

Je sais que cette question est sur Linux, mais sur Windows, j'ai eu le même problème. Il s'avère que vous devez démarrer l'invite de commande en mode "Exécuter en tant qu'administrateur" pour que cela fonctionne. Sinon, vous obtenez le même: impossible d'écrire l'erreur «état aléatoire».


13
Je cours sous Windows en tant qu'administrateur mais j'obtiens toujours l'erreur
Smalcat

6
Être administrateur sur la machine et utiliser "Exécuter en tant qu'administrateur" sont différents. "Exécuter en tant qu'administrateur" force le programme à s'exécuter en tant qu'administrateur, sinon même lorsque vous êtes administrateur, l'invite s'exécute avec une autorisation de sécurité non administrateur.
Beachhouse

67
Si vous exécutez en mode administrateur et que vous recevez toujours "Impossible d'écrire" état aléatoire "", une autre solution consiste à set RANDFILE=.rndexécuter avant openssl.
jevon

3
À Powershell, c'est $env:RANDFILE=".rnd"plutôt que set RANDFILE=.rnd.
x5657

Quel est l'inconvénient de NE PAS faire ça?
StanTastic

41

Un autre problème sur la plate-forme Windows, assurez-vous que vous exécutez votre invite de commande en tant qu'administrateur!

Je ne sais pas combien de fois cela m'a mordu ...


1
comme d'autres ont suggéré de définir cet ensemble RANDFILE = .rnd a fonctionné pour moi sans faire de ligne cmd avec l'administrateur
Svetoslav Marinov

16

Apparemment, j'avais besoin d'exécuter OpenSSL en tant que root pour qu'il ait l'autorisation sur le fichier d'amorçage.


16
Il est plus probable que vous l'ayez exécuté une fois en tant que root, après quoi le fichier .rnd dans votre répertoire personnel a été créé avec des autorisations définies pour root uniquement. Cela m'est arrivé il y a quelque temps. La suppression de .rnd a résolu le problème.
fotNelton

13

J'ai eu la même chose sur le serveur Windows. Ensuite, j'ai compris en changeant le vars.batqui est:

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

puis recommencez depuis le début et tout devrait bien se passer.


c'était ça! Merci. j'ai fait ce changement juste entre les commandes "init-config" et "vars", à partir des instructions (ici: openvpn.net/index.php/open-source/documentation/howto.html#pki ). doit être parce que j'ai installé la version 32 bits (que je préfère).
symbionte

4
Cela a fait l'affaire, et je n'ai pas eu à exécuter en tant qu'administrateur. Merci! En fait, j'ai simplement utiliséset HOME=.
Synetech

6

Le problème pour moi était que j'avais .rnd dans mon répertoire personnel mais il appartenait à root. Le supprimer et réémettre la commande openssl a corrigé ce problème.


6

Vous devez définir la variable d'environnement $ RANDFILE et / ou créer le fichier $ HOME / .rnd. ( FAQ OpenSSL ). (Bien sûr, vous devriez avoir des droits sur ce fichier. Les autres réponses ici sont à ce sujet. Mais vous devez d'abord avoir le fichier et une référence.)

Jusqu'à la version 0.9.6, OpenSSL écrivait le fichier d'amorçage dans le répertoire courant dans le fichier ".rnd". Dans la version 0.9.6a, vous n'avez pas de fichier d'amorçage par défaut. OpenSSL 0.9.6b et versions ultérieures se comportera de manière similaire à 0.9.6a, mais utilisera une valeur par défaut "C: \" pour HOME sur les systèmes Windows si la variable d'environnement n'a pas été définie.

Si le fichier d'amorçage par défaut n'existe pas ou est trop court, le message d'erreur «PRNG non prédéfini» peut se produire.

La variable d'environnement $ RANDFILE et $ HOME / .rnd sont uniquement utilisés par les outils de ligne de commande OpenSSL. Les applications utilisant la bibliothèque OpenSSL fournissent leurs propres options de configuration pour spécifier la source d'entropie, veuillez consulter la documentation fournie avec l'application.


2

Je suis tombé sur ce problème aujourd'hui sur AWS Lambda. J'ai créé une variable d'environnement RANDFILE = /tmp/.random

Cela a fait l'affaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.