имя хоста не соответствует сертификату сервера - не удается отправить электронное письмо

Я использую почту Pony для отправки сообщений электронной почты (потому что мне никогда не удавалось заставить ActionMailer работать на моем локальном компьютере с Windows).

Код в моем файле user_mailer.rb включает этот вызов метода Pony.mail:

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <[email protected]>', 
  :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'",...

Любое руководство будет с благодарностью!


person vbsql7    schedule 16.11.2012    source источник
comment
У меня талант задавать вопросы, на которые никто не хочет отвечать. :)   -  person vbsql7    schedule 17.11.2012


Ответы (1)


Немного поздно, но я также столкнулся с этой ошибкой, но с драгоценным камнем Ruby Mail. Если ваш SMTP-сервер поддерживает TLS, он попытается использовать TLS и аутентифицировать сертификат SSL. Если сертификат выдан для имени хоста, отличного от используемого, или если сертификат не может быть аутентифицирован (например, если он самозаверяющий и вы не доверяете ЦС), то произойдет сбой с ошибкой «имя хоста не соответствует сертификат сервера».

Чтобы обойти это, используйте параметр :openssl_verify_mode. Для этого можно установить значение OpenSSL::SSL::VERIFY_NONE, чтобы не выполнять проверку сертификата, хотя сеанс SMTP все равно будет шифроваться. Или есть другие варианты, доступные в библиотеке OpenSSL.

Используя ваш пример, это будет:

Pony.mail({
  :to => email_address, 
  :from => 'MyChairSales <[email protected]>', 
  :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.

person Philippe Green    schedule 10.12.2012
comment
ДА! Есть проблемы с безопасностью! Это позволяет любому в Интернете, кто находится между вами и вашим сервером, украсть ваше соединение и прочитать ваши данные. Вы НИКОГДА не должны делать это в безопасном приложении - вы должны работать только с серверами, которые выдают действительные сертификаты. - person Brad; 05.09.2014
comment
Да, это правда. Если вам необходимо проверить подлинность сервера, с которым вы общаетесь, чтобы предотвратить атаки «человек посередине», вам не следует отключать проверку хоста. Могут быть случаи, когда это не нужно или невозможно, если вы имеете дело с третьей стороной, которая выдает действительные сертификаты, но они по какой-то причине не соответствуют имени хоста. Явно не лучшая практика. - person Philippe Green; 10.10.2014
comment
Например, если вы отправляете электронное письмо на сторонний сервер без информации аутентификации smtp с именем пользователя и паролем, и вы выбрали отправку через TLS или обычный текст, но сертификат TLS не является доверенным сертификатом или не соответствует имени хоста. Отправка через TLS без проверки сертификата по-прежнему будет более безопасным вариантом. - person Philippe Green; 10.10.2014