Project

General

Profile

Bug #9848

OpenSSL::SSL::SSLContext の SSLv2 利用不可サーバへの接続時のデフォルト設定の応答について

Added by naitoh (Jun NAITOH) almost 6 years ago. Updated over 3 years ago.

Status:
Third Party's Issue
Priority:
Normal
Assignee:
openssl
Target version:
-
ruby -v:
ruby 2.0.0p481
[ruby-dev:48225]

Description

SSLv2利用不可なサーバに対する環境において、
以下のようなコードを 1.8.7 と 1.9.3 と 2.0.0 で実行した場合の結果が異なりました。

確認した ruby 版数は以下になります。

  • ruby 1.8.7p299
  • ruby 1.9.3p484
  • ruby 2.0.0p481

SSLContex オプション指定無し。

$ cat ssl_ng.rb
require 'socket'
require 'openssl'

io = TCPSocket.new("XXX.com", XXXX)
ctx = OpenSSL::SSL::SSLContext.new
conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
conn.connect
  • ruby 1.8.7
    ⇒ 問題無し。

  • ruby 1.9.3/2.0.0
    ⇒ エラー発生。
    ssl_ng.rb:7:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null) (OpenSSL::SSL::SSLError)

SSLv3 指定時

以下の様に SSLv3 を明示的に指定した場合は問題なく接続できました。

$ cat ssl_ok.rb
require 'socket'
require 'openssl'

io = TCPSocket.new("XXX.com", XXXX)
ctx = OpenSSL::SSL::SSLContext.new(:SSLv3)
conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
conn.connect
  • ruby 1.8.7/1.9.3/2.0.0 ⇒ 問題無し。

SSLv2 指定時

以下の様に SSLv2 を明示的に指定した場合は、全てエラーしました。 (期待通り)

$ cat  ssl_ng1.rb
require 'socket'
require 'openssl'

io = TCPSocket.new("XXX.com", XXXX)
ctx = OpenSSL::SSL::SSLContext.new(:SSLv2)
conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
conn.connect
  • ruby 1.8.7/2.0.0 ⇒ エラー発生。 ssl_ng1.rb:7:in `connect': SSL_connect returned=6 errno=0 state=SSLv2 read server hello A (OpenSSL::SSL::SSLError)

※ 1.9.3 は "ssl_ng1.rb:5:in initialize': unknown SSL methodSSLv2'. (ArgumentError)" となったので未確認。

SSLv23 指定時

SSLv23 を明示的に指定時には、1.9.3 と 2.0.0 でエラーが発生しました。

$ cat ssl_ng2.rb
require 'socket'
require 'openssl'

io = TCPSocket.new("XXX.com", XXXX)
ctx = OpenSSL::SSL::SSLContext.new(:SSLv23)
conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
conn.connect
  • ruby 1.8.7
    ⇒ 問題無し。

  • ruby 1.9.3/2.0.0
    ⇒ エラー発生。
    ssl_ng2.rb:7:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null) (OpenSSL::SSL::SSLError)

OpenSSL::SSL::SSLContextのデフォルト値として SSLv23 が設定されていると思うのですが、

  • ruby 1.8.7 : TLSv1/SSLv2/SSLv3 のいずれかが利用可能であれば、OK
  • ruby 1.9以降 : TLSv1/SSLv2/SSLv3 の全てが利用可能であれば、OK (SSLv2が利用不可の場合はエラー)

のように、挙動が変更になっていると推測されます。

ruby 1.8.7の挙動の方が望ましいと思うのですがいかがでしょうか

net-ldap (0.3.1 or 0.6.1)などでは、SSLContext をオプション指定無しで利用しているため、SSLv2 利用不可のサーバに接続する場合、ruby 1.9以降では接続できません。

#1

Updated by zzak (Zachary Scott) over 4 years ago

  • Assignee set to openssl

Updated by rhenium (Kazuki Yamaguchi) over 3 years ago

  • Status changed from Open to Third Party's Issue

OpenSSL は SSLv23_method() を使用したとき可能ならば SSL 2.0 形式の Client Hello を送信しますが、それが原因ではないでしょうか。

Ruby 1.8.7p299 と 1.9.3p484 の ext/openssl/ossl_ssl.c を比較する限り、差があるようには見えないので、リンクしている OpenSSL の違いではないかと想像します。

Also available in: Atom PDF