Rails 3:OpenSSL :: SSL :: SSLError:主机名与服务器证书不匹配

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

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 

一个比被接受的答案更好的解决scheme(就安全性而言)是:

 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' } 

这样你仍然会使用encryption,但是证书的validation将被禁用(并且你将不会得到任何错误)。

编辑:这个答案不再是最好的解决scheme,并可能不再工作 。 看到这个更安全的答案 。

证书上的名称应该与您运行应用程序的url匹配

没有用…我得到这个错误与dreamhost,我没有select更改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(如果不存在,则将其添加进去)。

警告:这将禁用encryption,这意味着您的用户名和密码将以纯文本方式穿越互联网

我看不出有这样做的更好方法,所以会对任何答案感兴趣。

如果你像我一样使用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)