PHPMailer生成PHP警告:stream_socket_enable_crypto():对等证书与预期不匹配

Rob*_*uka 40 php ssl openssl phpmailer

我在PHP 5.6上使用PHPMailer,在PHP 5.6中获得认证的增加的安全性当然很有趣.

我正在尝试向dreamhost上托管的域发送测试消息,PHPMailer返回的错误是:无法连接到SMTP主机.

这个错误不对,我已启用日志记录,这里是实际发生的事情.

连接:打开到mx1.sub4.homie.mail.dreamhost.com:25,timeout = 30,options = array()连接:打开S:220 homiemail-mx32.g.dreamhost.com ESMTP

C:EHLO s81a.ikbb.com

S:250-homiemail-mx32.g.dreamhost.com 250-PIPELINING 250-SIZE 40960000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250 8BITMIME

C:STARTTLS

S:220 2.0.0准备启动TLS

C:退出

S:SMTP错误:QUIT命令失败:连接:已关闭

我无法理解为什么PHPMailer只是放弃,在应该开始发送消息时发出QUIT命令.我从另一个日志中获得了另一条线索:

PHP警告:stream_socket_enable_crypto():对等证书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));
Run Code Online (Sandbox Code Playgroud)

如果我将SMTPOptions放在那里并跳过对等验证,则消息正常 - 在PHP中根本没有警告.

我如何捕获该错误,所以我知道存在问题但仍然发送消息?

小智 72

我有同样的问题,我在PHPMailer文档中找到了答案.

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
Run Code Online (Sandbox Code Playgroud)

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

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);
Run Code Online (Sandbox Code Playgroud)

你也可以在php.ini中全局更改这些设置,但这是一个非常糟糕的主意; PHP 5.6做了这个改变是有充分理由的.

有时这种行为并不那么明显; 有时加密失败可能表现为客户端在尝试执行STARTTLS后立即发出QUIT.如果您发现这种情况,则应检查证书或验证设置的状态.


小智 7

对于那些使用 cPanel 的人,我尝试了PHPMailer 中示例文件夹中的SMTP 检查代码,但得到了同样的错误:

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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

在 WHM 中禁用 SMTP 限制


Ana*_*Die 5

WHM/cPanel(s) 的解决方案:通过以下过程禁用SMTP 限制

a)打开 WHM 并搜索SMTP 限制,确保它已禁用。(您也可以直接通过主页»安全中心»SMTP 限制

在此处输入图片说明

b) 或者同样的事情可以通过调整设置来完成(直接去主页»服务器配置»调整设置或者你可以点击上图中显示的调整设置链接)

在此处输入图片说明

  • 我从早上就开始用头撞墙!非常感谢你是我的救星! (4认同)