我有以下情况:
服务器1:带有电子邮件服务器的Windows服务器。服务器地址模式:mail.myservers.com
服务器2:Ubuntu 20(一个月前全新安装(,带有lsws网络服务器,没有电子邮件服务器。服务器地址模式:s2.myservers.com
服务器2用于托管PHP应用程序。几天前,我安装了全新的wordpress网站。由于服务器2没有电子邮件服务器,所以发送邮件根本不起作用。所有站点都必须通过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疑难解答证书验证失败
- 我猜这是针对错误的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
echo QUIT | openssl s_client -crlf -starttls smtp -connect smtp.gmail.com:587
返回ok- 通过外部服务检查了
mail.myservers.com s2.myservers.com myproject.com
的证书。返回ok - 主机
127.0.0.1 s2.myservers.com s2 127.0.0.1 s2 .. ipv6 loopbacks
我没主意了。
编辑:miken回复
subject=C = US, O = IdenTrust, CN = IdenTrust Commercial Root CA 1
subject=C = US, O = IdenTrust, CN = IdenTrust Public Sector Root CA 1
Steffen回复
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:服务器返回的证书链缺少一个重要的中间证书。如果没有这一点,就无法根据信任存储检查服务器的叶证书。这就是验证失败的原因。
详细说明:邮件服务器返回的完整证书链如下:
Certificate chain
0 s:CN = mail.myservers.com
i:C = US, O = Let's Encrypt, CN = R3
从这个输出可以看出,服务器只返回服务器主题的叶证书,该证书由R3颁发。它不会返回ISRG根X1颁发的R3的中间证书。但是根证书是ISRG root X1,并且只有此根证书在信任存储中。另请参阅Let's Encrypt Certificate Hierarchy 2021。
修复需要在服务器端完成,即具有叶证书和中间证书的全链应由服务器提供。由于使用了hMailServer,请参阅本文档,该文档明确指出:;该证书应包含信任链(根CA和任何中介证书(。虽然有些应用程序可能会处理丢失的证书,或者有些应用程序只是忽略证书错误,但这仍然是服务器端的问题。
或者,可以在客户端通过将丢失的中间证书导入客户端信任存储来解决此问题。