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

Posted

技术标签:

【中文标题】Rails 3:OpenSSL::SSL::SSLError:主机名与服务器证书不匹配【英文标题】:Rails 3: OpenSSL::SSL::SSLError: hostname was not match with the server certificate 【发布时间】:2011-05-29 04:39:22 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

一个比公认答案更好的解决方案(就安全性而言)是:

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'

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

【讨论】:

显然,Bozhidar 的解决方案不仅启用了加密(笑脸!,+1),而且将问题缩小到证书验证。干得好! 显然,当这个问题得到回答时,这个选项还没有完全进入文档。这是一个更好的解决方案! +1 在您无法控制(可能是自签名的)SSL 证书(但您信任的)的主机上启用 TLS 的简洁方法当然您永远不会使用您没有的权限这样做不信任。比公认的答案安全得多。 谢谢博志达尔。同样对于dreamhost,我只是想为其他可能遇到与我相同的问题做一点说明,user_name 应该是username@domain.com(完整的形式)而不是仅用户名。 很高兴为您服务,珍妮 :-)【参考方案2】:

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

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

没用...我在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(如果不存在,则添加)。

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

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

【讨论】:

查看 Bozhidar 的解决方案,它启用了加密并将问题的根源缩小到证书验证。有趣! 在dreamhost中,更改:enable_starttls_auto => flash 感谢您更新此内容,我已更改接受的答案。【参考方案3】:

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

【讨论】:

【参考方案4】:

正如许多讨论这个问题的人都提到了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 是您的电子邮件集群所在的子域。目前可以在您的 Dreamhost 面板上找到,地址为 Panel > Support > Data Centers

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

【讨论】:

以上是关于Rails 3:OpenSSL::SSL::SSLError:主机名与服务器证书不匹配的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

SourceTree提示:OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

SourceTree提示:OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054