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

Luke Francl
la source

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.

Ville Laurikari
la source
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».

Maison de plage
la source
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 ...

joel
la source
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.

Luke Francl
la source
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.

Jusuf
la source
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.

Zds
la source
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.

Gangnus
la source
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.

Guilherme Mussi
la source