无法连接到 SMTP 主机 - 无法验证证书

Could not connect to SMTP host - failed to verify certificate

我有以下情况:

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

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

服务器 2 用于托管 PHP 应用程序。几天前我安装了 b运行d new wordpress web。由于服务器 2 没有电子邮件服务器,因此 sendmail 根本无法正常工作。所有站点都必须通过 SMTP 服务器使用解决方法,例如 wordpress 使用 PHPMailer.

使用地址模式 myproject.com 在服务器 2 上托管的网站。当我尝试从 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 故障排除步骤:

  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 returns 好的
  2. 已通过外部服务检查 mail.myservers.com s2.myservers.com myproject.com 的证书。 Returns还行
  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

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

详细说明:由邮件服务器 return 编辑的完整证书链是这样的:

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

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

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

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