为什么 Rails ActionMailer 6.1 / Ruby 3.0 不忽略自签名 SMTP 证书?

Why isn't a self signed SMTP Certificate ignored by Rails ActionMailer 6.1 / Ruby 3.0?

我无法让 Rails ActionMailer 6.1(使用 Ruby 3.0)连接到带有自签名证书的 SMTP 邮件程序。

所有可能根本不使用 TLS/SSL 或不验证证书的选项都在 config/production.rb 中设置并且似乎被 rails 正确拾取。

知道我可能遗漏了什么吗?

ruby --version
  ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux-musl]

RAILS_ENV=production myapp rails c
Loading production environment (Rails 6.1.4.6)
irb(main):001:0> mailer = ActionMailer::Base.new
=> #<ActionMailer::Base:0x00000000029c48>
irb(main):002:0> ap mailer.smtp_settings
{
                 :address => "smtpout.xxxxx.com",
                    :port => 25,
         :enable_starttls => false,
    :enable_starttls_auto => false,
     :openssl_verify_mode => 0,
                     :ssl => false,
                     :tls => false
}
=> nil
irb(main):003:0> mailer.mail(from: 'user1@example.com', to: 'user2@example.com',
    subject: 'test', body: "Hello, you've got mail!").deliver
/usr/local/lib/ruby/3.0.0/net/protocol.rb:46:in `connect_nonblock': SSL_connect
    returned=1 errno=0 state=error: certificate verify failed (self signed 
    certificate) (OpenSSL::SSL::SSLError)

这归结为以下几点:当我使用设置时

enable_starttls_auto: false,
openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE

它确实执行了 TLS 传输并失败并显示 state=error: certificate verify failed (self signed certificate) (OpenSSL::SSL::SSLError),这在我看来是双重错误,因为它甚至不应该开始 TLS 握手,如果是这样,应该跳过证书验证。

Rails 使用 Mail-Gem to handle these options, which indeed had an incompatible change.

作为我的解决方法,完全删除 enable_starttls_auto 设置(从而保持 TLS 传输),仅使用 openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE 禁用证书验证有帮助(但如果您有其他方法则无济于事)避免使用 TLS 而不是拥有伪造证书的原因)。