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

55

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

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个回答

136

一个在安全方面无限好的解决方案(相对于被接受的答案而言)是:

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

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


3
显然,Bozhidar的解决方案不仅实现了加密(微笑表情!+1),还将问题限定在证书验证上。干得好! - Lizz
1
显然,当回答这个问题时,文档中还没有完全涵盖这个选项。这是一个更好的解决方案! - user208769
1
在您无法控制(可能是自签名的)SSL证书的主机上启用TLS的一种干净方式(但您信任该证书)。当然,您永远不会使用不受信任的证书颁发机构。比接受的答案更安全。 - Peter Host
1
谢谢你,Bozhidar。另外,关于Dreamhost,我想为其他可能遇到与我相同问题的人提供一点提示:user_name应该是完整形式的username@domain.com,而不仅仅是username。 - datnt
很高兴为您服务,Zheni :-) - Bozhidar Batsov
Dreamhost的朋友们:如果你错过了,现在有更好的方法,你可能想要更新你的配置文件 - 请参见下面的答案 https://dev59.com/k2855IYBdhLWcg3wJg1y#48505842 - user208769

25

编辑:这个答案已不再是最佳解决方案,可能已无法使用。请参考此答案,该答案更加安全。

证书上的名称应与您运行应用程序的 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
}

将启用starttls自动选项更改为false(如果不存在则添加它)。

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

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


3
请查看Bozhidar的解决方案,它使加密变得可行并将问题源缩小到证书验证。有趣! - Lizz
在Dreamhost中,将: enable_starttls_auto => false更改为: - Tineo
1
感谢您更新这个问题,我已经更改了采纳的答案。 - JP Silvashy

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) 

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 是您的电子邮件集群所在的子域。目前,您可以在 Dreamhost 面板的 面板 > 支持 > 数据中心 中找到它。

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


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