[ruby-list:50825] Re: OpenSSLのセキュリティレベルの変更
From:
Yasuhiro KIMURA <yasu@...>
Date:
2019-09-27 23:07:26 UTC
List:
ruby-list #50825
木村です。
From: Yasuhiro KIMURA <yasu@utahime.org>
Subject: [ruby-list:50812] OpenSSLのセキュリティレベルの変更
Date: Sat, 24 Aug 2019 07:14:43 +0900 (JST)
> それで質問なのですが、Rubyのプログラムの中からOpenSSLのセキュリティレ
> ベルを変更することは可能でしょうか。標準ライブラリのドキュメントを検索
> して、OpenSSL::SSL::SSLContext#security_level=というメソッドがあるのは
> 判ったのですが、これとNet::HTTPをどう組み合わせたら良いのかがわかりま
> せん。この辺の具体的な手順が解る方がいらっしゃいましたら、教えてくださ
> い。
この件ですが、少なくとも現時点でのRubyでは不可能なようなので、Rubyの方
に以下のようなパッチを当てるという、反則技のような方法を採ることにしま
した。
----------------------------------------------------------------------
diff --git a/lib/net/http.rb b/lib/net/http.rb
index 31cbb7a866..a760a4a918 100644
--- a/lib/net/http.rb
+++ b/lib/net/http.rb
@@ -689,6 +689,7 @@ def initialize(address, port = nil)
SSL_IVNAMES.each do |ivname|
instance_variable_set ivname, nil
end
+ @security_level = OpenSSL::SSL::SSLContext.new.security_level
end
def inspect
@@ -746,6 +747,9 @@ def set_debug_output(output)
# Net::WriteTimeout is not raised on Windows.
attr_reader :write_timeout
+ # Security level applied to OpenSSL when HTTPS is used.
+ attr_accessor :security_level
+
# Maximum number of times to retry an idempotent request in case of
# Net::ReadTimeout, IOError, EOFError, Errno::ECONNRESET,
# Errno::ECONNABORTED, Errno::EPIPE, OpenSSL::SSL::SSLError,
@@ -979,6 +983,7 @@ def connect
end
end
@ssl_context = OpenSSL::SSL::SSLContext.new
+ @ssl_context.security_level = @security_level
@ssl_context.set_params(ssl_parameters)
@ssl_context.session_cache_mode =
OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
----------------------------------------------------------------------
これによって例えば、
----------------------------------------------------------------------
require 'net/http'
https = Net::HTTP.new("www.example.org", 443)
https.use_ssl
https.security_level = 0
----------------------------------------------------------------------
などとすればセキュリティレベルを変更することが出来ます。
あまり他の方に役立ちそうな気がしませんが、一応ご報告まで。
---
木村 康浩