2

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

  1. 一个猴子补丁。
  2. 它在核心问题上使用了一个巨大的创可贴,这是一个不正确的 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 版本而不依赖于上面示例中的猴子补丁?

4

0 回答 0