ruby-on-rails - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown 状态:未知协议(protocol)

标签 ruby-on-rails ruby ubuntu ssl amazon-web-services

我关注了很多关于这个问题的帖子,但没有一个对我有帮助。 我正在尝试使用最简单的 irb 命令进行连接:

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 <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 进行连接 - 在这种情况下,服务器只是在收到客户端问候后立即关闭连接(通过发送关闭通知警报)。

我用 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 Client Hello 广告支持。

顺便说一句,我的本地 ruby​​ 确实通过 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. 升级服务器以处理更多 Client Hello 变体,或者
  2. 安装一个使用旧 OpenSSL 库的 ruby​​,或者
  3. 更改您的程序以发送不同的 Client Hello。

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

关于ruby-on-rails - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown 状态:未知协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17369962/

相关文章:

ruby-on-rails - 如何在 ruby​​ on rails 中正确处理错误 url 到自定义 404 页面的重定向?

ruby-on-rails - 为什么 Rails 表单助手看起来像一个 do 循环?

ruby - 使用 Ruby Sinatra 的 HTML5 服务器发送事件

linux - 在 Linux Mint 20.1/Ubuntu 20.04 上安装/卸载 Docker 后网络连接中断

python - MySQL 连接器不工作 : NO module named Connector

ruby-on-rails - Rails 3 正确的地方创建实用方法

ruby-on-rails - 从 rspec 读取 rails env 变量

ruby-on-rails - Rails + Postgres fe_sendauth : no password supplied

ruby - `self` 在 ruby​​ 的嵌套方法中如何工作?

linux - 如何帮助可执行文件找到共享库?