Usando o OpenSSL, o que significa "incapaz de escrever 'estado aleatório'"?

407

Estou gerando um certificado SSL autoassinado para proteger a seção de administração do meu servidor e continuo recebendo esta mensagem do OpenSSL:

incapaz de escrever 'estado aleatório'

O que isto significa?

Este é um servidor Ubuntu. Atualizei o libssl para corrigir a vulnerabilidade de segurança recente .

Luke Francl
fonte

Respostas:

555

Na prática, o motivo mais comum para isso acontecer parece ser o fato de o arquivo .rnd no diretório inicial pertencer à raiz e não à sua conta. A solução rápida:

sudo rm ~/.rnd

Para mais informações, aqui está a entrada da FAQ do OpenSSL :

Às vezes, o utilitário de linha de comando openssl não interrompe com uma mensagem de erro "PRNG não propagada", mas reclama que é "incapaz de gravar 'estado aleatório'". Esta mensagem refere-se ao arquivo de propagação padrão (consulte a resposta anterior). Um possível motivo é que nenhum nome de arquivo padrão é conhecido porque nem RANDFILE nem HOME estão definidos. (Versões até 0.9.6 usavam o arquivo ".rnd" no diretório atual nesse caso, mas isso foi alterado com 0.9.6a.)

Então, eu verificaria RANDFILE, HOME e permissões para gravar nesses locais no sistema de arquivos.

Se tudo parece estar em ordem, você pode tentar correr com strace e ver o que exatamente está acontecendo.

Ville Laurikari
fonte
42
Meu sistema estava me dando esse problema porque o arquivo ".rnd" pertencia à raiz e não ao meu usuário. Um rápido sudo chown user:user ~/.rndfez tudo dar certo.
HalfBrian
1
Eu tive o mesmo problema que o OP. Eu fiz a sudocoisa e funcionou. Mas por que ainda tenho um .rnddiretório iwned pela raiz no meu $ HOME depois de criar um certificado autoassinado?
Luc
3
Sim, se você executa a partir do servidor web php, o usuário é www-data e você deve adicionar "export" antes de cada abertura: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1')
diyism
2
Se você estiver usando uma linguagem de script como PHP para chamar openssl como www-data, poderá resolvê-lo criando /var/www/.rnde exibindo-a www-data. (Supondo que /var/wwwseja www-dataa pasta inicial da pasta, que está na maioria dos sistemas. Você pode verificar www-dataa pasta pessoal com cat /etc/passwd | grep www-data) #
Nick
1
Eu estava usando o Windows - é claro, precisava executar o prompt do CMD como administrador! Ao fazer isso, contornou esse problema.
NickBeaugié
264

Eu sei que esta pergunta está no Linux, mas no Windows eu tive o mesmo problema. Acontece que você precisa iniciar o prompt de comando no modo "Executar como administrador" para que ele funcione. Caso contrário, você obtém o mesmo: incapaz de gravar o erro 'estado aleatório'.

Beachhouse
fonte
13
Estou executando no Windows como administrador, mas ainda obter o erro
Smalcat
6
Ser administrador na máquina e usar "Executar como administrador" são diferentes. "Executar como administrador" força o programa a ser executado como administrador; caso contrário, mesmo quando você for administrador, o prompt será executado com uma habilitação de segurança que não seja de administrador.
Beachhouse
67
Se você estiver executando no modo de administrador e ainda estiver recebendo "Não é possível gravar 'estado aleatório'", outra solução é set RANDFILE=.rndantes de executar openssl.
Jevon
3
No PowerShell, isso é $env:RANDFILE=".rnd"melhor que set RANDFILE=.rnd.
X5657
Qual é a desvantagem de NÃO fazer isso?
StanTastic
41

Mais um problema na plataforma Windows: verifique se você está executando o prompt de comando como Usuário Administrativo!

Eu não sei quantas vezes isso me mordeu ...

joel
fonte
1
como outros sugeriram a definição dessa RANDFILE set = .rnd trabalhou para mim sem fazer linha de cmd com o Administrador
Svetoslav Marinov
16

Aparentemente, eu precisava executar o OpenSSL como root para ter permissão para o arquivo de propagação.

Luke Francl
fonte
16
É mais provável que você o tenha executado como raiz no momento em que o arquivo .rnd no diretório inicial foi criado com permissões definidas apenas para raiz. Isso aconteceu comigo um tempo atrás. A exclusão de .rnd resolveu o problema.
FotNelton 29/09
13

Eu tinha a mesma coisa no servidor Windows. Então eu descobri mudando o vars.batque é:

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

refaça do começo e tudo ficará bem.

Jusuf
fonte
foi isso! obrigado. Eu fiz essa alteração entre os comandos "init-config" e "vars", a partir das instruções (aqui: openvpn.net/index.php/open-source/documentation/howto.html#pki ). deve ser porque eu instalei a versão de 32 bits (que eu prefiro).
Symbiont
4
Isso fez o truque, e eu não tive que executar como administrador. Obrigado! Na verdade, eu simplesmente useiset HOME=.
Synetech
6

O problema para mim era que eu tinha .rnd no meu diretório pessoal, mas era de propriedade do root. A exclusão e a reemissão do comando openssl corrigiram isso.

Zds
fonte
6

Você deve definir a variável de ambiente $ RANDFILE e / ou criar o arquivo $ HOME / .rnd. ( FAQ do OpenSSL ). (Obviamente, você deve ter direitos sobre esse arquivo. Outras respostas aqui são sobre isso. Mas primeiro você deve ter o arquivo e fazer uma referência a ele.)

Até a versão 0.9.6, o OpenSSL gravou o arquivo de propagação no diretório atual no arquivo ".rnd". Na versão 0.9.6a, você não possui um arquivo de propagação padrão. O OpenSSL 0.9.6be posterior comportará-se de maneira semelhante a 0.9.6a, mas usará o padrão "C: \" para HOME nos sistemas Windows se a variável de ambiente não tiver sido definida.

Se o arquivo de propagação padrão não existir ou for muito curto, a mensagem de erro "PRNG não propagada" pode ocorrer.

A variável de ambiente $ RANDFILE e $ HOME / .rnd são usadas apenas pelas ferramentas de linha de comando do OpenSSL. Os aplicativos que usam a biblioteca OpenSSL fornecem suas próprias opções de configuração para especificar a fonte de entropia; confira a documentação que acompanha o aplicativo.

Gangnus
fonte
2

Hoje deparei com esse problema na AWS Lambda. Criei uma variável de ambiente RANDFILE = /tmp/.random

Isso fez o truque.

Guilherme Mussi
fonte