为什么 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 而不是拥有伪造证书的原因)。
我无法让 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 而不是拥有伪造证书的原因)。