【发布时间】:2011-10-12 20:36:08
【问题描述】:
我正在尝试在 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 客户端(Patron,基于 libcurl),它可以工作:
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'在它不工作的机器上说什么,在它工作的机器上说什么? -
工作:
OpenSSL 0.9.8k 25 Mar 2009不工作:OpenSSL 0.9.8o 01 Jun 2010似乎最新版本有所不同。