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

Php 无法连接到SMTP主机-验证证书失败,php,wordpress,email,ssl,smtp,Php,Wordpress,Email,Ssl,Smtp,我有以下情况: 服务器1:带有电子邮件服务器的Windows服务器。服务器地址模式:mail.myserver.com 服务器2:Ubuntu20(一个月前新安装),带有LSWSWeb服务器,没有电子邮件服务器。服务器地址模式:s2.myserver.com 服务器2用于托管PHP应用程序。几天前,我安装了全新的wordpress网站。由于服务器2没有电子邮件服务器,因此sendmail根本无法工作。所有站点都必须通过SMTP服务器使用变通方法,就像wordpress使用PHPMailer一样

我有以下情况:

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

服务器2:Ubuntu20(一个月前新安装),带有LSWSWeb服务器,没有电子邮件服务器。服务器地址模式:
s2.myserver.com

服务器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的时间是同步的
  • PHP编译器故障排除证书验证失败
  • 我猜这是错误的PHP版本(7.2)。Web正在使用8.0,所以我将conf编辑为下面的路径
  • curl.cainfo=/etc/ssl/certs/ca-certificates.crt, openssl.cafile=/etc/ssl/certs/ca-certificates.crt

  • echo退出| openssl s|u客户端-crlf-starttls smtp-connect smtp.gmail.com:587
    返回ok
  • 通过外部服务检查
    mail.myserver.com s2.myserver.com myproject.com
    的证书。返回ok
  • 主人
  • 我没有主意了

    编辑: 米肯回答

    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:服务器返回的证书链缺少重要的中间证书。如果没有此选项,则无法根据信任存储检查服务器的叶证书。这就是验证失败的原因

    详细说明:邮件服务器返回的完整证书链如下:

    Certificate chain
     0 s:CN = mail.myservers.com
       i:C = US, O = Let's Encrypt, CN = R3
    
    从这个输出可以看出,服务器只返回带有服务器主题的叶证书,该主题由R3颁发。它不会返回ISRG根X1颁发的R3的中间证书。但是根证书是ISRG root X1,并且只有此根证书在信任存储中。另见

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


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

    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,并且只有此根证书在信任存储中。另见

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


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

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