我跟随了很多关于这个问题的post,其中没有帮助。 我正尝试使用最简单的irb命令进行连接:
require 'open-uri' open ('https://aristo4stu3.bgu.ac.il')
奇怪的是,对于任何其他https uri我试过了,它工作正常(即https://google.com )。
出于debugging目的,我甚至尝试使用以下方法禁用SSLvalidation:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
这似乎也没有帮助。
我的设置是(在AWS上):
$ rvm -v rvm 1.21.3 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/] $ ruby -v ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 13.04 Release: 13.04 Codename: raring
完整的日志:
2.0.0-p247 :001 > require 'open-uri' => true 2.0.0-p247 :002 > open('https://aristo4stu3.bgu.ac.il') OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: (null) from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `block in connect' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:862:in `do_start' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:851:in `start' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:313:in `open_http' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:708:in `buffer_open' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `catch' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:688:in `open' from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:34:in `open' from (irb):2 from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'
问题似乎是你的目标站点aristo4stu3.bgu.ac.il
对SSL / TLS握手很挑剔。 使用不同版本的OpenSSL,下面的OpenSSL命令得到了两个不同的结果:
openssl s_client -connect aristo4stu3.bgu.ac.il:443
这与OS X 10.7.5上的股票OpenSSL 0.9.8x连接。 但是,它不使用OpenSSL 1.0.1e连接 – 在这种情况下,服务器在收到客户端Hello后立即关闭连接(通过发送Close Notify警报)。
我用Wireshark抓包,这两个版本之间的区别在于0.9.8x通过TLS 1.0发送SSLv2 Client Hello广告支持,而1.0.1e通过TLS 1.2发送TLSv1 Client Hello广告支持。
如果我告诉1.0.1e不要使用TLS:
openssl s_client -connect aristo4stu3.bgu.ac.il:443 -no_tls1
这与通过SSL 3.0的SSLv3客户端Hello广告支持成功连接。
顺便说一句,我的本地红宝石确实与您的网站的open-uri
成功连接:
$ irb >> require 'open-uri' => true >> open('https://aristo4stu3.bgu.ac.il') => #<StringIO:0x10271fa90> >> require 'openssl' => false >> OpenSSL::OPENSSL_VERSION => "OpenSSL 0.9.8r 8 Feb 2011" >>
所以指出的方法似乎是:
看来open-uri
模块没有选项来设置用于通信的SSL / TLS版本。 如果无法修改服务器,则可能需要使用其他模块或库来建立连接,或者找到一种方法来修补openssl
模块,以便使用不同的Client Hello。
我在这里找到了一个很好的问题解答。 http://blog.55minutes.com/2012/05/tls-error-with-ruby-client-and-tomcat-server/
TLDR代码片段,解决了这个问题。
http = Net::HTTP.new(host, port) http.use_ssl = true http.ssl_version = :SSLv3 http.start { ... }
我收到了同样的消息,结果证明我在非SSL连接上设置了http.use_ssl = true
。
如果你在Mac上,这是一个OSX证书问题(这是我的情况),你可以通过运行以下解决方案:
rvm osx-ssl-certs update all