使用OpenSSL,“无法写入'随机状态'”是什么意思?


407

我正在生成一个自签名SSL证书来保护服务器的admin部分,并且不断从OpenSSL收到此消息:

无法写“随机状态”

这是什么意思?

这是在Ubuntu服务器上。我已经升级了libssl以修复最近的安全漏洞

Answers:


555

实际上,发生这种情况的最常见原因似乎是您的主目录中的.rnd文件是由root而非您的帐户拥有的。快速修复:

sudo rm ~/.rnd

有关更多信息,这是OpenSSL FAQ中的条目:

有时,openssl命令行实用程序不会因“ PRNG not seed”错误消息而中止,而是抱怨它“无法写入'随机状态'”。此消息引用默认的种子文件(请参阅上一个答案)。可能的原因是,由于既未设置RANDFILE也未设置HOME,因此默认文件名未知。(在这种情况下,版本高达0.9.6的文件在当前目录中使用了文件“ .rnd”,但在0.9.6a中已更改。)

因此,我将检查RANDFILE,HOME和写入文件系统中那些位置的权限。

如果一切似乎都正常,则可以尝试使用strace运行并查看到底发生了什么。


42
我的系统给了我这个问题,因为“ .rnd”文件是root拥有的,而不是我的用户拥有的。快速解决sudo chown user:user ~/.rnd了所有问题。
HalfBrian

1
我和OP有同样的问题。我做了那sudo件事,它奏效了。但是,为什么.rnd在创建自签名证书后,我的$ HOME中仍拥有root 拥有的目录?
吕克M

3
是的,如果您从php Web服务器运行,则用户为www-data,并且应在每个openssl之前添加“ export”:shell_exec('export RANDFILE =“。rnd”; openssl ecparam -genkey -name secp256k1'))
diyism 2013年

2
如果您使用PHP之类的脚本语言将openssl称为www-data,则可以通过将其创建/var/www/.rnd并加为来解决www-data。(假设这/var/wwwwww-data大多数系统上的主目录,您可以使用来检查www-data主目录cat /etc/passwd | grep www-data
Nick

1
我正在使用Windows-当然,我需要以管理员身份运行CMD提示符!这样做,解决了这个问题。
NickBeaugié

264

我知道这个问题是在Linux上,但是在Windows上我有同样的问题。原来,您必须在“以管理员身份运行”模式下启动命令提示符,它才能正常工作。否则,您将得到相同的结果:无法写入“随机状态”错误。


13
我以管理员身份在Windows上运行,但仍然收到错误
Smalcat 2012年

6
作为计算机的管理员和使用“以管理员身份运行”是不同的。“以管理员身份运行”强制程序以管理员身份运行,否则即使您是管理员,提示也会以非管理员安全权限运行。
海滨别墅

66
如果您以管理员模式运行,但收到“无法写入'随机状态'”,则另一种解决方案是set RANDFILE=.rnd在执行之前openssl
jevon 2013年

3
在Powershell中,$env:RANDFILE=".rnd"它不是set RANDFILE=.rnd
x5657

不这样做的不利之处是什么?
StanTastic,

41

Windows平台上的另一个问题,请确保您以管理用户身份运行命令提示符!

我不知道这咬了我多少次...


正如其他建议设置此设置一样,RANDFILE = .rnd对我有用,而无需与管理员进行cmd行
Svetoslav Marinov,

16

显然,我需要以root用户身份运行OpenSSL,以使其具有对种子文件的权限。


16
您很有可能曾经以root用户身份运行过,因此在主目录中创建.rnd文件时,其权限仅设置为root。这发生在我前一段时间。删除.rnd解决了此问题。
fotNelton

12

我在Windows Server上也有同样的事情。然后我通过更改更改来找出vars.bat

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

然后从头开始重做,一切都应该没问题。


就是这样!谢谢。我根据说明(在这里:openvpn.net/index.php/open-source/documentation/howto.html#pki)在“ init-config”和“ vars”命令之间进行了更改。一定是因为我安装了32位版本(我更喜欢)。
symbiont

4
那成功了,我不必以管理员身份运行。谢谢!实际上,我只是用过set HOME=.
Synetech

6

对我来说,问题是我的主目录中有.rnd,但它是root拥有的。删除它并重新发出openssl命令可以解决此问题。


5

您应该设置$ RANDFILE环境变量和/或创建$ HOME / .rnd文件。(OpenSSL FAQ)。(当然,您应该拥有该文件的权限。其他答案与此有关。但是首先,您应该拥有该文件及其引用。)

最高版本为0.9.6,OpenSSL在当前目录中将种子文件写入文件“ .rnd”。在0.9.6a版本中,没有默认的种子文件。OpenSSL 0.9.6b及更高版本的行为与0.9.6a相似,但是如果未设置环境变量,则Windows系统上的HOME将使用默认值“ C:\”。

如果默认的种子文件不存在或太短,则可能会出现“ PRNG not seeded”错误消息。

$ RANDFILE环境变量和$ HOME / .rnd仅由OpenSSL命令行工具使用。使用OpenSSL库的应用程序提供了自己的配置选项来指定熵源,请查看应用程序随附的文档。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.