2011-07-25 12 views
5

Rubyスクリプトでサーバhttps://www.xpiron.com/scheduleに接続しようとしています。私は、接続しようとするただし、:Ruby SSLエラー - sslv3警告予期しないメッセージ

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をに基づいてパトロンを、)を使用する場合

はさらに、それが動作:

require 'patron' 

sess = Patron::Session.new 
sess.timeout = 5 
url = 'https://www.xpiron.com/schedule' 
resp = sess.get(url) 
puts "#{resp.body}" 

だから、これはRubyのOpenSSLのバインディングの問題のように見えます。

+0

することができ 'ルビー-ropenssl -e「OpenSSLの:: OPENSSL_VERSION''を置きますそれが動作していないマシンとそれが動作しているマシンでは何が起こっているのでしょうか? – emboss

+0

作業中: 'OpenSSL 0.9.8k 25 Mar 2009' 'OpenSSL 0.9.8o 01 Jun 2010' 最近のバージョンでは何かのようなものがあります。 – marketer

答えて

9

私自身の質問に答えるだけです。

RubyがSSL接続をネゴシエートする方法に問題があるようです。 XpironのTLSメカニズムにエラーがあり、他のSSLバージョンにリトライするのではなくエラーが発生します。

あなたが3.0にSSLのバージョンを強制した場合、それが動作します:

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 

私もRubyのbug tracker上の問題を作成しました。

+1

RoRを使用している場合、これらの変更を行ったファイルを教えてください – Aleksandrus

2

私はそれがhttps URLのためだと思います。これをバイパスするための、完全に安全ではないハックがありますが、あなた自身の責任でそれをgoogleしてください。私はむしろネットを使用して、あなたにそれを行うための安全な方法が表示されます:: HTTPを:

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 
store = OpenSSL::X509::Store.new 
store.add_cert OpenSSL::X509::Certificate.new(File.new('addtrust_ca.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('utn.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('user_first_ca.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('xpiron.pem')) 
sock.cert_store = store 
sock.start do |http| 
    response = http.request(req) 
end 

あなたはブラウザ(例:Firefox)で、あなたのURLを入力して、アイコンの左をクリックして証明書ファイルを入手することができますURL /詳細情報/証明書/詳細の表示 - >チェーン内の各証明書をクリックし、上で使用した名前でPEMファイルとしてエクスポートします。これらのファイルを参照するスクリプトと同じディレクトリに配置します。それは魔法を行うべきです。しかし、そのページにログインするにはクッキーが必要であることに気づいたので、リクエストを適切に変更するためにはもう少し手間がかかります。

+0

お返事ありがとうございました。私はすべてを試みたが、エラーはまだそこにある。私は問題がxpiron SSLサーバーが誤って構成されていると思う。 Chromeは '接続はSSL 3.0を使用して再試行しなければならなかった。これは、通常、サーバが非常に古いソフトウェアを使用していることを意味し、他のセキュリティ問題を抱えている可能性があります。 – marketer

+0

あなたは解決策を見つけてうれしいです! – emboss

0

rest-client gemには、この執筆時点でこれを設定する手段はありません。 an outstanding pull requestがありますが、宝石は残念ながら維持されていないようです。

+0

プルリクエストの新しいURL:https://github.com/rest-client/rest-client/pull/123 –

1

がハッキングの完全な一日を過ごした後、このいずれかが最終的に私の仕事:

url = URI.parse("https://full-url?test=1&foo=bar") 
response = Net::HTTP.start(url.host, use_ssl: true, ssl_version: 'SSLv3', verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http| 
    http.get url.request_uri 
end 
0

それは何

require 'openssl' 
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE