mar*_*ter 5 ruby openssl mechanize
我正在尝试https://www.xpiron.com/schedule用ruby脚本连接到服务器.但是,当我尝试连接时:
require 'open-uri'
doc = open('https://www.xpiron.com/schedule')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
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>'
Run Code Online (Sandbox Code Playgroud)
我正在运行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}"
Run Code Online (Sandbox Code Playgroud)
所以这似乎是Ruby的OpenSSL绑定的一个问题.
只是回答我自己的问题.
问题似乎在于Ruby如何协商SSL连接.Xpiron的TLS机制中存在错误,它会抛出错误而不是重试其他SSL版本.
如果强制SSL版本为3.0,则可以:
require 'net/http'
url = URI.parse('https://www.xpiron.com/schedule')
req = Net::HTTP::Get.new(url.path)
sock = Net::HTTP.new(url.host, 443)
sock.use_ssl = true
sock.ssl_version="SSLv3"
sock.start do |http|
response = http.request(req)
end
Run Code Online (Sandbox Code Playgroud)
我还在Ruby的bug跟踪器上创建了一个问题.
| 归档时间: |
|
| 查看次数: |
12773 次 |
| 最近记录: |