gpt4 book ai didi

ruby - 如何在 Ruby 中设置 TLS 上下文选项(如 OpenSSL::SSL::SSL_OP_NO_SSLv2)

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:51 26 4
gpt4 key购买 nike

在 C 中使用 OpenSSL 时,我们在上下文中设置选项以删除 SSLv2 和 SSLv3 等薄弱和受伤的协议(protocol)。来自 ssl.h,这里是一些有用选项的位掩码:

#define SSL_OP_NO_SSLv2     0x01000000L
#define SSL_OP_NO_SSLv3 0x02000000L
#define SSL_OP_NO_TLSv1 0x04000000L
#define SSL_OP_NO_TLSv1_2 0x08000000L
#define SSL_OP_NO_TLSv1_1 0x10000000L

但是,我在 Ruby 中设置它们时遇到了问题:

if uri.scheme == "https"
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.options = OpenSSL::SSL::SSL_OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 |
OpenSSL::SSL::SSL_OP_NO_COMPRESSION
end

结果:

$ ./TestCert.rb
./TestCert.rb:12:in `<main>': uninitialized constant OpenSSL::SSL::SSL_OP_SSL2 (NameError)

Ruby docs for 1.9.3 (和 2.0.0)甚至懒得提它。

如何在 Ruby 中设置 TLS 上下文选项?


相关:setting SSLContext options in ruby .但是当 http.use_ssl = true 时,无法将上下文附加到 http

最佳答案

在 Ruby OpenSSL 库中,选项常量没有以“SSL_”为前缀。您可以通过在 irb/console 中运行如下内容来查看选项常量列表:OpenSSL::SSL.constants.grep(/OP_/)。这是定义它们的相关 ruby​​ C 源代码:https://github.com/ruby/ruby/blob/trunk/ext/openssl/ossl_ssl.c#L2225 .

编辑:似乎没有开箱即用的方法来设置 net http 的 SSL 选项。参见 https://bugs.ruby-lang.org/issues/9450 .

不过目前您可以使用这个小技巧:

(Net::HTTP::SSL_IVNAMES << :@ssl_options).uniq!
(Net::HTTP::SSL_ATTRIBUTES << :options).uniq!

Net::HTTP.class_eval do
attr_accessor :ssl_options
end

现在只需在 Net::HTTP 实例上设置 ssl_options 访问器。用法示例:

uri = URI('https://google.com:443')

options_mask = OpenSSL::SSL::OP_NO_SSLv2 + OpenSSL::SSL::OP_NO_SSLv3 +
OpenSSL::SSL::OP_NO_COMPRESSION

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)

if uri.scheme == "https"
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ssl_options = options_mask
end

response = http.request request

# To Test
ssl_context = http.instance_variable_get(:@ssl_context)
ssl_context.options == options_mask # => true

我正在使用 ruby​​ 2.1.2 进行测试,因此您在其他版本的 ruby​​ 上的使用情况可能会有所不同。如果它不适用于您的首选版本,请告诉我。

对于那些感兴趣的人,我查看了创建此 hack 的 ruby​​ 代码的相关部分:https://github.com/ruby/ruby/blob/e9dce8d1b482200685996f64cc2c3bd6ba790110/lib/net/http.rb#L886

关于ruby - 如何在 Ruby 中设置 TLS 上下文选项(如 OpenSSL::SSL::SSL_OP_NO_SSLv2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com