我正在尝试在Ruby脚本中连接服务器https://www.xpiron.com/schedule
。但是,当我尝试连接时:
require 'open-uri'
doc = open('https://www.xpiron.com/schedule')
我收到了以下错误信息:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: sslv3 alert unexpected message
from /usr/local/lib/ruby/1.9.1/net/http.rb:678:in `connect'
from /usr/local/lib/ruby/1.9.1/net/http.rb:678:in `block in connect'
from /usr/local/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
from /usr/local/lib/ruby/1.9.1/timeout.rb:87:in `timeout'
from /usr/local/lib/ruby/1.9.1/net/http.rb:678:in `connect'
from /usr/local/lib/ruby/1.9.1/net/http.rb:637:in `do_start'
from /usr/local/lib/ruby/1.9.1/net/http.rb:626:in `start'
from /usr/local/lib/ruby/1.9.1/net/http.rb:1168:in `request'
from /usr/local/lib/ruby/1.9.1/net/http.rb:888:in `get'
from (irb):32
from /usr/local/bin/irb:12:in `<main>'
我正在运行Ruby 1.9.2p180。它在其他一些机器上可以工作,所以可能是OpenSSL或Ruby的配置问题。我尝试重新安装所有SSL库并从头开始重建Ruby,但似乎没有什么作用。有人遇到过这个问题吗?
更新
在不工作的机器上,openssl版本为0.9.8o 01 Jun 2010
在工作的机器上,它是0.9.8k 25 Mar 2009
因此,更新的版本似乎出现了故障。
此外,如果我使用不同的HTTP客户端(基于libcurl的Patron),它可以工作:
require 'patron'
sess = Patron::Session.new
sess.timeout = 5
url = 'https://www.xpiron.com/schedule'
resp = sess.get(url)
puts "#{resp.body}"
看起来这似乎是Ruby的OpenSSL绑定出了问题。
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
在无法工作的机器上会输出什么?在能够运行的机器上又会输出什么呢? - embossOpenSSL 0.9.8k 25 Mar 2009
不工作:OpenSSL 0.9.8o 01 Jun 2010
看起来较新版本中有些不同。 - marketer