【问题标题】:Using OpenSSL what does "unable to write 'random state'" mean?使用 OpenSSL “无法写入‘随机状态’”是什么意思?
【发布时间】:2010-09-10 19:14:37
【问题描述】:

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

无法写入“随机状态”

这是什么意思?

这是在 Ubuntu 服务器上。我已升级 libssl 以修复 the recent security vulnerability

【问题讨论】:

    标签: openssl


    【解决方案1】:

    我今天在 AWS Lambda 上遇到了这个问题。我创建了一个环境变量 RANDFILE = /tmp/.random

    成功了。

    【讨论】:

    • 我在 lambda 中遇到了同样的问题,这解决了问题。谢谢
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      显然,我需要以 root 身份运行 OpenSSL 才能获得种子文件的权限。

      【讨论】:

      • 很有可能您曾经以 root 身份运行它,然后您的主目录中的 .rnd 文件是使用仅为 root 设置的权限创建的。这件事不久前发生在我身上。删除 .rnd 解决了这个问题。
      【解决方案4】:

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

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

      【讨论】:

      • 其他人建议设置此设置 RANDFILE=.rnd 为我工作,无需与管理员进行 cmd 行
      【解决方案5】:

      我在 Windows 服务器上也有同样的事情。然后我通过更改vars.bat 弄清楚了:

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

      然后从头开始重做,一切都会好起来的。

      【讨论】:

      • 就是这样!谢谢。我根据说明在“init-config”和“vars”命令之间进行了此更改(此处:openvpn.net/index.php/open-source/documentation/howto.html#pki)。一定是因为我安装的是 32 位版本(我更喜欢)。
      • 成功了,我不必以管理员身份运行。谢谢!其实我只是用set HOME=.
      【解决方案6】:

      我知道这个问题在 Linux 上,但在 Windows 上我也遇到了同样的问题。事实证明,您必须在“以管理员身份运行”模式下启动命令提示符才能使其工作。否则你会得到相同的结果:无法写入“随机状态”错误。

      【讨论】:

      • 我以管理员身份在 Windows 上运行,但仍然出现错误
      • 作为机器上的管理员和使用“以管理员身份运行”是不同的。 “以管理员身份运行”强制程序以管理员身份运行,否则即使您是管理员,提示也会以非管理员安全权限运行。
      • 如果您在管理员模式下运行并且仍然收到“无法写入'随机状态'”,另一种解决方案是在执行openssl 之前先set RANDFILE=.rnd
      • 在 Powershell 中这是 $env:RANDFILE=".rnd" 而不是 set RANDFILE=.rnd
      • 不这样做有什么坏处?
      【解决方案7】:

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

      sudo rm ~/.rnd
      

      有关更多信息,请参阅OpenSSL FAQ 的条目:

      有时,openssl 命令行实用程序不会中止并显示“PRNG 未播种”错误消息,但会抱怨它“无法写入‘随机状态’”。此消息指的是默认种子文件(请参阅上一个答案)。一个可能的原因是不知道默认文件名,因为 RANDFILE 和 HOME 都没有设置。 (在这种情况下,最高 0.9.6 的版本在当前目录中使用了文件“.rnd”,但随着 0.9.6a 的变化。)

      所以我会检查 RANDFILE、HOME 和写入文件系统中这些位置的权限。

      如果一切正常,您可以尝试使用strace 运行,看看到底发生了什么。

      【讨论】:

      • 我的系统给了我这个问题,因为“.rnd”文件归根用户而不是我的用户所有。一个快速的sudo chown user:user ~/.rnd 让一切顺利。
      • 我遇到了和 OP 一样的问题。我做了sudo 的事情,它奏效了。但是为什么在我创建自签名证书后,我的 $HOME 中仍然有一个由 root 拥有的 .rnd 目录?
      • 是的,如果你从php web服务器运行,用户是www-data,你应该在每个openssl之前添加“export”:shell_exec('export RANDFILE=".rnd";openssl ecparam - genkey -name secp256k1'))
      • 如果您使用像 PHP 这样的脚本语言将 openssl 作为 www-data 调用,您可以通过创建 /var/www/.rnd 并将其更改为 www-data 来解决此问题。 (假设/var/wwwwww-data 的主文件夹,它在大多数系统上都存在。您可以使用cat /etc/passwd | grep www-data 检查www-data 的主文件夹)
      • 我使用的是 Windows - 当然,我需要以管理员身份运行 CMD 提示符!这样做,解决了这个问题。
      【解决方案8】:

      对我来说,问题是我的主目录中有 .rnd,但它归根用户所有。删除它并重新发出 openssl 命令修复了这个问题。

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 2019-08-10
        • 2011-08-28
        • 2013-08-14
        相关资源
        最近更新 更多