ssl PHPMailer生成PHP警告:数据流套接字启用加密():对等证书与预期不匹配

twh00eeo  于 2022-11-14  发布在  PHP
关注(0)|答案(8)|浏览(165)

我在PHP5.6上使用PHPMailer,在PHP5.6中围绕认证增加的安全性当然是有趣的。
我正在尝试发送一个测试消息到dreamhost上的一个域,从PHPMailer返回的错误是:无法连接到SMTP主机。
这个错误是不正确的,我已经启用了日志记录,下面是实际发生的情况。
连接:打开到mx1.sub4.homie.mail.dreamhost.com:25,超时=30,选项=数组()连接:已打开S:220 homiemail-mx32.g.dreamhost.com ESMTP
C:亿豪s81a.ikbb.com
S:250-homiemail-mx32.g.dreamhost.com 250-管道250-大小40960000 250-ETRN 250-启动250-增强的状态代码250 8位MIME
C:星星
S:220 2.0.0准备启动TLS
C:退出
S:SMTP错误:QUIT命令失败:连接方式:封闭的
我不明白为什么PHPMailer在应该开始发送消息的时候却放弃了,发出了一个QUIT命令。我从另一个日志中得到了另一个线索:
PHP警告:数据流套接字启用加密():对等凭证CN= *.mail.dreamhost.com' did not match expected CN= mx1.sub4.homie.mail.dreamhost.com '位于/home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10/class.smtp.php
如果我使用一些自定义选项来阻止验证他们正在使用的证书,我可以让它继续。下面是我所拥有的:

$mail->SMTPOptions = array (
        'ssl' => array(
            'verify_peer'  => false,
            'verify_peer_name'  => false,
            'allow_self_signed' => true));

如果我把SMTPOnices放在那里,跳过对等验证,消息就正常了--PHP中根本没有警告。
如何捕获该错误,以便在知道存在问题的情况下仍发送消息?

iqjalb3h

iqjalb3h1#

我遇到了同样的问题,我在PHPMailer documentation中找到了答案。

PHP 5.6证书验证失败

PHP 5.6在SSL连接上验证证书,如果你连接的服务器的SSL配置不正确,你会得到如下错误:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

**正确的解决方法是用一个好的证书替换无效的、配置错误的或自签名的证书。**如果做不到这一点,您可以通过PHPMailer 5.2.10中引入的SMTPOnices属性允许不安全的连接(在早期版本中,可以通过将SMTP类子类化来实现这一点),但不建议这样做:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

您也可以在php.ini中全局地更改这些设置,但这确实不是一个好主意; PHP 5.6做这个改变有很好的理由。
有时候这种行为并不十分明显;有时,加密失败可能会显示为客户端在尝试执行STARTTLS后立即发出QUIT。2如果您看到这种情况,您应该检查证书或验证设置的状态。

c9qzyr3d

c9qzyr3d2#

WHM/cPanel的解决方案:通过以下过程禁用SMTP限制***:
**a)打开WHM,搜索
SMTP限制
*,确保它被禁用。(您也可以直接通过***主页安全中心SMTP限制***)

B)****或通过***调整设置***(直接进入***主页服务器配置调整设置***或您可以单击上图所示的调整设置链接)完成相同的操作

bqf10yzr

bqf10yzr3#

对于那些使用cPanel的人,我尝试了PHPMailer中examples文件夹中的SMTP check code,但我得到了同样的错误:

PHP Warning: stream_socket_enable_crypto(): Peer certificate  CN=*.mail.dreamhost.com' did not match expected CN=mx1.sub4.homie.mail.dreamhost.com' in /home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10/class.smtp.php

我意识到这不是一个与PHPMailer相关的错误,所以我搜索了与CentOS相关的类似错误,我发现了以下链接,它提供了一些线索:Issue sending mails through 3rd party。您必须查看cPanel中的“SMTP限制”。

wvyml7n5

wvyml7n54#

禁用WHM中的SMTP限制

yqyhoc1h

yqyhoc1h5#

对于PHP 5.6,使用以下代码。添加“tls://”是关键字。

$mail->Host = gethostbyname('tls://smtp.gmail.com');

请参阅:http://php.net/manual/en/context.ssl.php

ndh0cuux

ndh0cuux6#

我在我的WordPress机器上升级到PHP 5.6后遇到了类似的问题。WP Mail SMTP by WPForms(wp-mail-smtp)插件被配置为使用localhost作为SMTP主机。我已经将其更改为FQHN(完全合格的主机名),因为它在SSL证书中定义。更改后,它工作正常。

rks48beu

rks48beu7#

正如有人在这里提到的,问题是一个无效的SSL证书。您的网站可能有一个有效的SSL证书,但它可能不适用于mail.website.netsmtp.website.net子域。如果您的主机提供商有一个接口为您的网站生成SSL证书,尝试搜索是否有一个选择子域的可能性,证书将生成。

rsaldnfx

rsaldnfx8#

如果您刚迁移到另一台服务器,很可能可以通过禁用WHM的SMTP限制来解决此问题:

相关问题