私はこの問題に関する多くの投稿をフォローしてきましたが、どれも助けになりませんでした。最も簡単な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 <[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>'
問題は、ターゲットサイトaristo4stu3.bgu.ac.il
がSSL/TLSハンドシェイクにうるさいということです。 OpenSSLのバージョンが異なる次のOpenSSLコマンドで2つの異なる結果が得られました。
openssl s_client -connect aristo4stu3.bgu.ac.il:443
これは、OS X 10.7.5の標準のOpenSSL 0.9.8xと接続します。ただし、not OpenSSL 1.0.1eを使用して接続します。その場合、サーバーはClient Helloを受信した直後に(Close Notifyアラートを送信して)接続を閉じます。
Wiresharkでパケットをキャプチャしました。これらの2つのバージョンが送信するものの違いは、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"
>>
したがって、示されているアプローチは次のようです:
open-uri
モジュールには、通信に使用されるSSL/TLSバージョンを設定するオプションがないようです。サーバーを変更できない場合は、別のモジュールまたはライブラリを使用して接続を確立するか、openssl
モジュールにパッチを適用して別のClient Helloを使用する方法を見つける必要があります。
Macを使用していて、それがOSX証明書の問題である場合(私がそうでした)、次のコマンドを実行して修正できます。
rvm osx-ssl-certs update all
https://rvm.io/support/fixing-broken-ssl-certificates を参照してください
私は問題と解決策の良い記事をここに見つけました。 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 { ... }
同じメッセージを受信しましたが、http.use_ssl = true
非SSL接続で設定します。