如何手动设置邮件模块的SSL / TLS版本

时间:2017-05-10 19:48:25

标签: ruby email ssl jruby jruby-openssl

我正在使用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问题,但我根本不喜欢这个解决方案,因为它是:

  1. 猴子补丁。
  2. 它在核心问题上应用了一个巨大的绑定,这是一个不正确的TLS版本。
  3. 我为我的应用提出的解决方案是,我只需要在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版本?

0 个答案:

没有答案