Ruby Enterprise Edition + OpenSSL -> "证书验证失败"

3

我正在尝试让REE与SSL协作,但是遇到了一些问题。

每当我连接到一个SSL网站时:

require 'open-uri'
open 'https://www.google.com'

I get the following error:

/Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:586:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:586:in `connect'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:553:in `do_start'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:542:in `start'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:242:in `open_http'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in `catch'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:518:in `open'
from /Users/jon/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:30:in `open'

在Ruby 1.9.2或常规的1.8.7下运行良好。我尝试重新打包OpenSSL并安装ree以链接它,如 RVM OpenSSL页面中所述,但没有效果。我使用的是OS X 10.6.7,但我们的OpenSolaris REE安装也出现了同样的问题。
非常感谢您提供任何建议。
1个回答

3
似乎它没有正确地获取受信任的CA证书的位置 - REE必须具有不同的编译默认位置,这对您的系统来说是不正确的。

留给后人:

原帖作者的问题通过下载http://curl.haxx.se/ca/cacert.pem并将其复制到/opt/local/etc/openssl/cert.pem中得以解决。


是的,我一直在尝试将证书添加到/opt/local/etc/openssl目录中,但无法让Ruby看到它们。不太确定我缺少什么。 - Jonathan del Strother
@jdelStrother:你在那个目录下使用过c_rehash实用程序来创建哈希链接吗?这是必要的。 - caf
1
是的。我应该能够从http://curl.haxx.se/ca/cacert.pem等网站上获取cacerts.pem,将其复制到/opt/local/etc/openssl中,运行c_rehash创建符号链接,然后它应该开始工作了...对吗?还是说我需要将cacert.pem拆分成单独的证书? - Jonathan del Strother
1
@jdelStrother:OpenSSL 可以有一个默认的 CA 路径 和/或默认的 CA 文件cacert.pem 就是后者 - 你只需要将它重命名(或创建一个符号链接指向它)为 REE 正在使用的默认 CAfile 的单一名称即可。/opt/local/etc/openssl 可能是默认的 CApath,如果是这样,你就需要破解证书 - 你可以从 Debian ca-certificates 包源文件 中获取这些证书。 - caf
感谢关于CAfile和CApath的指针 - 我终于意识到它实际上并没有在那个目录中搜索所有证书,所以它需要一个特定的名称。将 cacert.pem 捆绑移到 /opt/local/etc/openssl/cert.pem 已经解决了问题,我想。 - Jonathan del Strother

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接