Rails 3:OpenSSL :: SSL :: SSLError:hostname与服务器证书不匹配

时间:2010-12-22 02:58:46

标签: ruby-on-rails ruby-on-rails-3 openssl ssl-certificate

尝试通过控制台发送电子邮件时,我收到此错误:

OpenSSL::SSL::SSLError: hostname was not match with the server certificate

问题是我真的不太了解证书等,或者真的如何开始对此进行故障排除,我尝试用openssl进行一些调查,这里是返回的证书。

我不知道它是在服务器上运行的Postfix有问题,还是我的rails应用程序,任何帮助或线索都非常感谢。

~% openssl s_client -connect mail.myhostname.com:25 -starttls smtp
CONNECTED(00000003)
depth=0 /CN=myhostname
verify error:num=18:self signed certificate
verify return:1
depth=0 /CN=myhostname
verify return:1
---
Certificate chain
 0 s:/CN=myhostname
   i:/CN=myhostname
---
Server certificate
-----BEGIN CERTIFICATE-----
[...redacted...]
-----END CERTIFICATE-----
subject=/CN=myhostname
issuer=/CN=myhostname
---
No client certificate CA names sent
---
SSL handshake has read 1203 bytes and written 360 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 1AA4B8BFAAA85DA9ED4755194C50311670E57C35B8C51F9C2749936DA11918E4
    Session-ID-ctx: 
    Master-Key: 9B432F1DE9F3580DCC6208C76F96631DC5A4BC517BDBADD5F514414DCF34AC526C30687B96C5C4742E9583555A118232
    Key-Arg   : None
    Start Time: 1292985376
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 DSN

4 个答案:

答案 0 :(得分:130)

比接受的答案更好的解决方案(就安全而言)是:

ActionMailer::Base.smtp_settings = {
  :address              => "mail.foo.com",
  :port                 => 587,
  :domain               => "foo.com",
  :user_name            => "addy@foo.com",
  :password             => "foofoo",
  :authentication       => "plain",
  :enable_starttls_auto => true,
  :openssl_verify_mode  => 'none'
}

这样您仍然会使用加密,但证书的验证将被禁用(并且您不会收到任何错误)。

答案 1 :(得分:25)

编辑:此答案不再是最佳解决方案,可能不再有效。请参阅更安全的this answer

  

证书上的名称应与运行应用程序的网址相匹配

没用...我在dreamhost中遇到此错误,我无法更改ssl证书。 (好吧,我这样做,但费用很高。)

一种选择是禁用tls。希望你在初始化器中有这样的东西:

ActionMailer::Base.smtp_settings = {
  :address              => "mail.foo.com",
  :port                 => 587,
  :domain               => "foo.com",
  :user_name            => "addy@foo.com",
  :password             => "foofoo",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

将enable starttls auto选项更改为false(如果不存在,则将其添加)。

警告:这将禁用加密,这意味着您的用户名密码将以纯文本形式通过互联网

我看不出更好的方法,所以对任何答案都感兴趣。

答案 2 :(得分:1)

如果你像我一样使用ruby邮件库,这里是pop

的设置
pop = Net::POP3.new(mail_server, mail_port)
pop.enable_ssl(0) #(default is on, if you want turn it off set it to 0 )
pop.start(mail_username, mail_pwd) 

答案 3 :(得分:0)

由于很多人在讨论这个问题时已经提到过dreamhost,因此对这个问题有一个更好的Dreamhost特定答案。

近年来,您的电子邮件软件可能已经开始变得更加好战,因为您在证书上使用了错误的服务器名称。作为回复,Dreamhost现在建议您在设置电子邮件帐户时使用他们的域名而不是您自己的域名。

您需要找出您的帐户所分配的邮件群集,然后您的配置如下:

ActionMailer::Base.smtp_settings = {
  :address              => "mail.foo.com",
  :port                 => 587,
  :domain               => "subX.mail.dreamhost.com" # instead of "foo.com",
  :user_name            => "addy@foo.com",
  :password             => "foofoo",
  :authentication       => "plain",
  :enable_starttls_auto => true,
  # :openssl_verify_mode  => 'none' # hopefully, no longer needed
}

其中subX是您的电子邮件群集所在的子域。目前,您可以在Panel > Support > Data Centers

的Dreamhost面板上找到它

可在其电子邮件客户端配置页面上找到更多详细信息:https://help.dreamhost.com/hc/en-us/articles/214918038-Email-client-configuration-overview