【发布时间】: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 故障排除证书验证失败
- 我猜这是针对错误的 PHP 版本 (7.2)。 Web 使用的是 8.0,所以我将 conf 编辑到下面的路径
php -i | grep cafile openssl.cafile => no value => no valuecurl.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返回正常 - 通过外部服务检查了
mail.myservers.com s2.myservers.com myproject.com的证书。返回正常 - 主机
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