【问题标题】:Could not connect to SMTP host - failed to verify certificate无法连接到 SMTP 主机 - 无法验证证书
【发布时间】:2021-08-19 21:29:56
【问题描述】:

我有以下情况:

服务器 1:带有电子邮件服务器的 Windows 服务器。服务器地址模式:mail.myservers.com

服务器 2:Ubuntu 20(一个月前新安装),带有 lsws 网络服务器,没有电子邮件服务器。服务器地址模式:s2.myservers.com

Server 2 用于托管 PHP 应用程序。几天前,我安装了全新的 wordpress 网络。由于服务器 2 没有电子邮件服务器,因此 sendmail 根本无法正常工作。所有网站都必须通过 SMTP 服务器使用解决方法,例如 wordpress 使用 PHPMailer。

使用地址模式myproject.com 托管在服务器 2 上的 Web。当我尝试从 wordpress 管理中测试 SMTP 时,出现以下错误。

Versions:
WordPress: 5.7.2
WordPress MS: No
PHP: 8.0.2
WP Mail SMTP: 2.8.0

Params:
Mailer: smtp
Constants: No
ErrorInfo: SMTP Error: Could not connect to SMTP host.
Host: mail.myservers.com
Port: 587
SMTPSecure: tls
SMTPAutoTLS: bool(true)
SMTPAuth: bool(true)

Server:
OpenSSL: OpenSSL 1.1.1f 31 Mar 2020
Apache.mod_security: No

Debug:
Mailer: Ostatní SMTP
SMTP Error: Could not connect to SMTP host.

SMTP Debug:
2021-06-01 16:30:46 Connection: opening to mail.myservers.com:587, timeout=300, options=array()

2021-06-01 16:30:46 Connection: opened

2021-06-01 16:30:46 SERVER -> CLIENT: 220 mail.myservers.com ESMTP

2021-06-01 16:30:46 CLIENT -> SERVER: EHLO myproject.com

2021-06-01 16:30:46 SERVER -> CLIENT: 250-mail.myservers.com250-SIZE 30720000250-STARTTLS250-AUTH LOGIN250 HELP

2021-06-01 16:30:46 CLIENT -> SERVER: STARTTLS

2021-06-01 16:30:46 SERVER -> CLIENT: 220 Ready to start TLS

2021-06-01 16:30:46 Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [/home/myproject.com/public_html/wp-includes/PHPMailer/SMTP.php line 467]

SMTP Error: Could not connect to SMTP host.

2021-06-01 16:30:46 CLIENT -> SERVER: QUIT

2021-06-01 16:30:46

2021-06-01 16:30:46

2021-06-01 16:30:46 Connection: closed

SMTP Error: Could not connect to SMTP host.

我在 LetsEncrypt 证书上运行了 4 年的电子邮件服务器。从那以后我就没有问题了。我的猜测是在 ubuntu 服务器上配置错误。

我阅读了一些主题,包括 PHPMailer 故障排除步骤:

  • Ubuntu 时间同步
  • PHPMailer 故障排除证书验证失败
  1. 我猜这是针对错误的 PHP 版本 (7.2)。 Web 使用的是 8.0,所以我将 conf 编辑到下面的路径
php -i | grep cafile
openssl.cafile => no value => no value

curl.cainfo =/etc/ssl/certs/ca-certificates.crt, openssl.cafile=/etc/ssl/certs/ca-certificates.crt

  1. echo QUIT | openssl s_client -crlf -starttls smtp -connect smtp.gmail.com:587返回正常
  2. 通过外部服务检查了mail.myservers.com s2.myservers.com myproject.com 的证书。返回正常
  3. 主机
127.0.0.1 s2.myservers.com s2
127.0.0.1 s2

.. ipv6 loopbacks

我的想法用完了。

编辑: 麦肯回复

subject=C = US, O = IdenTrust, CN = IdenTrust Commercial Root CA 1
subject=C = US, O = IdenTrust, CN = IdenTrust Public Sector Root CA 1

史蒂芬回复

openssl s_client -connect mail.myservers.com:587 -starttls smtp
CONNECTED(00000003)
depth=0 CN = mail.myservers.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = mail.myservers.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:CN = mail.myservers.com
   i:C = US, O = Let's Encrypt, CN = R3
---
Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
subject=CN = mail.myservers.com

【问题讨论】:

  • 您在/etc/ssl/certs/ca-certificates.crt 有证书包吗?它是否包含您要连接的服务器的 CA?更改 php.ini 文件后,您是否重新启动了 Web 服务器?
  • @miken32 /etc/ssl/certs/ca-certificates.crt 文件存在。我可以在 linux 中看到有很多证书。但是,如果我将其下载到 Windows,我只能看到一个。我怎样才能检查它?编辑:lsws 更改后重新启动
  • “我在 LetsEncrypt 证书上运行了 4 年的电子邮件服务器。” - 真的是 mail 服务器吗?因为配置和可能的证书也不同于 web 服务器。 “从那以后我就没有问题了。” - 这意味着您可以使用来自其他系统的 SMTP(邮件)和 TLS 并进行完整的证书验证,但不能来自这个特定的系统?
  • @SteffenUllrich 是的,这听起来很奇怪,但是我将 LetsEncrypt 用于邮件服务器。每 14 天生成新证书。我正在使用来自 iOS 和 Windows 客户端的连接。然而我不得不承认在使用 unix 之前从未尝试过。我改变了一会儿通过谷歌 smtp 发送 - 它有效。很久以前(例如 1 年)我在服务器 1 上托管 wordpress,使用 smtp 工作。
  • 要查看捆绑包中的证书,请使用openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt | openssl pkcs7 -print_certs -noout | grep ^subject

标签: php wordpress email ssl smtp


【解决方案1】:

TL;DR:服务器返回的证书链缺少重要的中间证书。没有这个,服务器的叶子证书就不能根据信任库进行检查。这就是验证失败的原因。

详细说明:邮件服务器返回的完整证书链是这样的:

Certificate chain
 0 s:CN = mail.myservers.com
   i:C = US, O = Let's Encrypt, CN = R3

从这个输出可以看出,服务器只返回带有服务器主题的叶子证书,由R3颁发。它不返回由 ISRG Root X1 颁发的 R3 的中间证书。但是根证书是ISRG Root X1,并且只有这个根证书在信任库中。另见Let's Encrypt Certificate Hierarchy 2021

修复需要在服务器端完成,即带有叶证书和中间证书的完整链应由服务器提供。由于使用了 hMailServer,另请参阅 this documentation,其中明确指出:“除了服务器证书之外,此证书还应包含信任链(根 CA 和任何 中间证书)”。虽然有些应用程序可能会解决缺少证书的问题,或者有些只是忽略证书错误,但这仍然是服务器端问题。

或者,可以通过将缺少的中间证书导入客户端信任库,在客户端解决该问题。

【讨论】:

  • 我可以确认这是正确的解决方案。一旦我将根 + 中间证书添加到公钥文件中并重新启动服务它的工作!非常感谢您指导我。
猜你喜欢
  • 2018-05-18
  • 2014-05-01
  • 2021-05-28
  • 2020-09-07
  • 1970-01-01
  • 2016-05-02
  • 2012-05-24
  • 2012-06-17
相关资源
最近更新 更多