我正在使用 JRuby 中的 Ruby Mail 模块修复与 SSL 相关的错误。这个 Github 问题解释了这个错误(并提供了一个猴子补丁) 。
该错误的要点是,在 JRuby-1.7.19 之后的某个时间,引入了一项更改,该更改更改了 Net::SMTP 与 MRI 相关的行为。为了解决这个问题,我们必须使用以下 TLS 版本TLSv1_2_client
才能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
我试过这个,它确实解决了Algorithm NONE
我通过猴子修补 SSLContext 来使用的问题TLSv1_2_client
,但我根本不喜欢这个解决方案,因为它是:
- 一个猴子补丁。
- 它在核心问题上使用了一个巨大的创可贴,这是一个不正确的 TLS 版本。
我为我的应用程序提出的解决方案是我只是有一个由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]
现在我打算 fork Ruby Mail 模块,并修改smtp.rb
文件以允许自己手动设置 SSL 版本。
我同意分叉 Ruby Mail 模块并自己进行更改。
我尝试了以下方法:
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version] = :TLSv1_2_client
这确实设置了默认的 SSL 版本,但没有解决我的问题。
如何手动设置 SSL 版本而不依赖于上面示例中的猴子补丁?