主机名与服务器证书不匹配 - 无法发送电子邮件。

8

我使用Pony邮件发送邮件 (因为我无法在我的本地Windows电脑上让ActionMailer正常工作)。

在user_mailer.rb文件中的代码包括对Pony.mail方法的调用:

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <support@mychairsales.com>', 
  :subject => subject, 
  :body => email_body, 
  :html_body => html_body,
  :via => :smtp,
  :via_options => {
    :address              => 'mail.mychairsales.com',
    :port                 => '25',
    :enable_starttls_auto => true,
    :user_name            => 'mychairs',
    :password             => 'thepassword',
    :domain               => "mychairsales.com" # the HELO domain provided by the client to the server
  } 
 })

这个方法之前是可以用的(我曾经成功地通过这种方式收到过邮件),但现在出现了错误:“主机名与服务器证书不匹配”。

以下是堆栈跟踪的顶部:

["/usr/lib64/ruby/1.9.3/openssl/ssl-internal.rb:121:in `post_connection_check'",
"/usr/lib64/ruby/1.9.3/net/smtp.rb:585:in `tlsconnect'", "/usr/lib64/ruby/1.9.3
/net/smtp.rb:560:in `do_start'", "/usr/lib64/ruby/1.9.3/net/smtp.rb:519:in `start'", 
"/home4/mychairs/ruby/gems/gems/mail-2.4.4/lib/mail/network/delivery_methods
/smtp.rb:144:in `deliver!'", "/home4/mychairs/ruby/gems/gems/mail-2.4.4/lib
/mail/message.rb:245:in `deliver!'", "/home4/mychairs/ruby/gems/gems/pony-1.4/lib
/pony.rb:166:in `deliver'", "/home4/mychairs/ruby/gems/gems/pony-1.4/lib
/pony.rb:138:in `mail'", "/home4/mychairs/rails_apps/chairsales/app/mailers
/user_mailer.rb:32:in `send_mail'", "/home4/mychairs/rails_apps/chairsales/app/mailers
/user_mailer.rb:23:in `send_password_reset_email'",...

任何指导都将不胜感激!


我有一个天赋,就是问一些没人在意的问题 :) - vbsql7
1个回答

21

我有点晚了,但我也遇到了这个错误,不过是在使用Ruby Mail gem时。如果您的SMTP服务器支持TLS,它将尝试使用TLS并验证SSL证书。如果证书是为其他主机名颁发的,或者如果证书无法被验证(例如,如果它是自签名的,而您不信任CA),那么它将以“主机名与服务器证书不匹配”的错误失败。

为了解决这个问题,您可以使用:openssl_verify_mode选项。这可以设置为OpenSSL::SSL::VERIFY_NONE来不验证证书 - 它仍会加密SMTP会话。或者还有其他在OpenSSL库中可用的选项。

使用您的示例,代码如下:

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <support@mychairsales.com>', 
  :subject => subject, 
  :body => email_body, 
  :html_body => html_body,
  :via => :smtp,
  :via_options => {
    :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE, 
    :address              => 'mail.mychairsales.com',
    :port                 => '25',
    :enable_starttls_auto => true,
    :user_name            => 'mychairs',
    :password             => 'thepassword',
    :domain               => "mychairsales.com" # the HELO domain provided by the client to the server
  } 
 })

对于 Mail gem 也适用。


2
是的!存在安全问题!这会允许互联网上任何位于您和服务器之间的人窃取您的连接并读取您的数据。在安全应用程序中,您绝不能这样做 - 您只能使用发行有效证书的服务器。 - Brad
1
是的,这是真的。如果你需要验证你正在通信的服务器的身份以防止中间人攻击,那么你不应该关闭主机验证。可能有些情况下这并不是必要或可能的,如果你正在处理一个发行“有效”证书但由于某种原因它们与主机名不匹配的第三方,则可能无法进行验证。显然,这不是最佳实践。 - Philippe Green
例如,如果您要向第三方服务器发送电子邮件,但没有用户名/密码SMTP身份验证信息,并且您的选择是通过TLS或纯文本发送,但TLS证书不是受信任的证书或与主机名不匹配。 通过TLS发送而不验证证书仍将是更安全的选项。 - Philippe Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接