2013-06-28 54 views
11

我已经按照关于这个问题,非很多帖子的帮助了他们。 我试图用最简单的IRB命令连接:的OpenSSL :: SSL :: SSLError:所以SSL_connect返回= 1个错误号= 0状态=未知状态:未知协议

require 'open-uri' 
open ('https://aristo4stu3.bgu.ac.il') 

奇怪的是,对于任何其它HTTPS URI我试过了,它工作得很好(即https://google.com)。

出于调试目的,我甚至尝试使用禁用SSL验证:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 

这并不似乎于事无补。

我的设置是(在AWS):

$ rvm -v 

rvm 1.21.3 (stable) by Wayne E. Seguin <[email protected]>, Michal Papis <[email protected]> [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>' 
+0

什么都在日志您服务器说? – vgoff

+0

@vgoff,你是什么意思?它发生在本地,与irb。 – Rizon

+0

您正在本地运行open-uri,这是真的,但它连接到的服务器不会为您的Ruby ssl客户端提供它正在查找的内容。用他的见解见@rhashimoto。 – vgoff

回答

15

这个问题似乎是你的目标网站,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正在发送SSLv2客户端通过TLS 1.0支持Hello广告支持,而1.0.1e正在发送TLSv1客户端通过TLS发送Hello广告支持1.2。

如果我告诉1.0.1e不使用TLS:

openssl s_client -connect aristo4stu3.bgu.ac.il:443 -no_tls1 

这成功与客户的SSLv3你好广告支持通过SSL连接3.0。

顺便说一句,我的本地红宝石确实让与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" 
>> 

所以表示方法似乎是:

  1. 升级服务器处理更多的客户您好变种,或者
  2. 安装一个使用旧版OpenSSL库的红宝石,或者
  3. 改变你的程序发送一个不同的t客户您好。

似乎open-uri模块没有设置用于通信的SSL/TLS版本的选项。如果您无法修改服务器,则可能需要使用不同的模块或库来建立连接,或者找到一种方法来修补openssl模块,以便使用不同的Client Hello。

+0

我认为选项3是最优雅的去(服务器不在我的控制和降级Ruby应该是最后的手段)。实际上,我并没有在代码中使用open-uri,而是Excon。 Excon是否提供设置客户端Hello的选项?如果不是,RestClient有吗? – Rizon

+0

我不知道这些特定的库。我确实发现了一个密切相关的问题,但是,这有一些建议:http://stackoverflow.com/questions/6821051/ruby-ssl-error-sslv3-alert-unexpected-message。 – rhashimoto

+0

@Rizon当我使用Chrome访问您的目标网站时,正如其中一条评论所暗示的,当我单击锁定图标时,我会得到相同的响应:“必须使用较早版本的TLS或SSL协议重新尝试连接。这通常意味着服务器使用的是非常旧的软件,并且可能存在其他安全问题。“这支持您需要使用库(或编写自己的库)以便重试或使用旧版协议开始的发现。 – rhashimoto

3

我收到了同样的消息,结果我发现http.use_ssl = true设置为非SSL连接。

相关问题