Techioz Blog

自己署名 SMTP 証明書が 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: '[email protected]', to: '[email protected]',
    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: 証明書の検証に失敗しました (自己署名証明書) (OpenSSL::SSL::SSLError) で失敗します。これは私の目には二重に間違っています。TLS ハンドシェイクを開始することさえないはずです。 、証明書の検証をスキップする必要があります。

Rails は Mail-Gem を使用してこれらのオプションを処理しますが、実際には互換性のない変更がありました。

私の場合の回避策として、enable_starttls_auto 設定を完全に削除し (TLS 送信を維持する)、openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE で証明書の検証を無効にするだけで役に立ちました (ただし、TLS を回避する他の理由がある場合は役に立ちません)私のような偽の証明書を持っているよりも)。