2012-07-08 166 views
3

我收到一个间歇性错误,说当试图生成表单身份验证令牌时,没有播种伪随机数生成器。我已经复制了以下堆栈跟踪的相关部分。PRNG没有播种错误

这里就是我知道/看: - 重启乘客似乎暂时解决这个问题 - 运行从控制台相同的代码按预期工作 - 的/ dev/urandom的存在,所以它应该是能够使用该种子 - 这发生在Ubuntu 10.04上,使用openssl 0.9.8k,ree 1.8.7 p253和passenger 3.0.3。 - 我读过关于独角兽的一个问题,听起来就像重新启动工人时发生的那样,但没有看到乘客上描述的那种东西。

SessionsController#new (ActionView::TemplateError) "PRNG not seeded" 
/usr/local/lib/ruby/1.8/securerandom.rb:53:in `random_bytes' 
/usr/local/lib/ruby/1.8/securerandom.rb:53:in `random_bytes' 
/usr/local/lib/ruby/1.8/securerandom.rb:105:in `base64' 
vendor/bundle/ruby/1.8/gems/actionpack-2.3.14/lib/action_controller/request_forgery_protection.rb:109:in `form_authenticity_token' 
(eval):2:in `send' 
(eval):2:in `form_authenticity_token' 

相当难倒。任何帮助不胜感激。

+0

什么操作系统?难道'SecureRandom'没有足够的熵? – Linuxios 2012-07-08 13:33:28

+0

看起来像Ubuntu 10.04。 – 2012-07-09 00:23:07

+0

我应该寻找什么迹象来确定它是否没有足够的熵?我不认为这会是一个问题,因为openssh的版本使用/ dev/urandom,但我不是这方面的专家。 – hubert 2012-07-10 09:50:40

回答

0

假设都/dev/random/dev/urandom读/写的,但您仍然收到此错误,也许你需要运行/安装熵产生像prngd

尝试:

$ sudo /etc/init.d/prngd start 

,如果失败,安装prngd第一:

$ sudo apt-get install prngd 
0

牵强的假说。代码的相关位应该是这样的(可能这是不一样的版本):

def self.random_bytes(n=nil) 
    n ||= 16 
    if defined? OpenSSL::Random 
    @pid = 0 if !defined?(@pid) 
    pid = $$ 
    if @pid != pid 
     now = Time.now 
     ary = [now.to_i, now.usec, @pid, pid] 
     OpenSSL::Random.seed(ary.join('.')) 
     @pid = pid 
    end 
    return OpenSSL::Random.random_bytes(n) 
end 

,我们知道OpenSSL的给你报告,如果饲喂熵少于128位的错误。它总共是16个字节(或者18..22,如果OpenSSL足够聪明,可以识别一串ASCII可打印字符并忽略高位)。

初始化OpenSSL的序列类似于1342652367.A.0.B;有时可能有可能pid足够小,并且微秒接近零,结果熵降至临界阈值以下?

这应该是很容易测试:为了与

Digest::MD5.hexdigest(ary.join('.')) 

更换

ary.join('.') 

有一定-128位,可能是偶数256位串合理的不可预测的长度。

更确定的检查是添加一个异常并打印错误触发时的ary。