我正在使用JRuby中的Ruby Mail模块修复与SSL相关的错误。这个Github问题解释了(并提供了一个猴子补丁)这个bug。
该错误的要点是在JRuby-1.7.19之后的某个时候,引入了一个改变Net :: SMTP行为的改变与MRI相关。为了解决此问题,我们必须对TLSv1_2_client
使用以下TLS版本OpenSSL::SSL::SSLContext
才能通过SSL / TLS发送邮件。
打开问题的人建议使用以下针对Mail模块的猴子补丁:
require 'net/smtp'
class << Net::SMTP
remove_method :default_ssl_context # if defined?(Net::SMTP.default_ssl_context)
end
module Net
class SMTP
def SMTP.default_ssl_context
OpenSSL::SSL::SSLContext.new('TLSv1_2_client')
end
end
end
我尝试了这个,并确实通过修补SSLContext使用Algorithm NONE
修复了TLSv1_2_client
问题,但我根本不喜欢这个解决方案,因为它是:
我为我的应用提出的解决方案是,我只需要在OpenSSL::SSL::SSLCOntext::METHODS
中填入一个下拉列表。 METHODS
的输出是:
0> OpenSSL::SSL::SSLContext::METHODS
=> [:TLSv1, :TLSv1_server, :TLSv1_client, :SSLv3, :SSLv3_server, :SSLv3_client, :SSLv23, :SSLv23_server, :SSLv23_client, :TLS, :TLSv1_1_server, :TLSv1_1_client, :TLSv1_1, :TLSv1_2, :TLSv1_2_server, :TLSv1_2_client]
现在我打算分叉Ruby Mail模块,并修改smtp.rb
file以允许自己手动设置SSL版本。
我可以分叉Ruby Mail模块并自己进行更改。
我尝试了以下内容:
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version] = :TLSv1_2_client
确实设置了默认的SSL版本,但没有解决我的问题。
如何在不依赖上述示例的猴子补丁的情况下手动设置SSL版本?