PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败

2022-08-30 16:14:37

遇到电子邮件应从具有自签名证书的邮件服务器发送的问题,我收到的错误是:

PHP 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 in class.smtp.php on line 327.

有没有人遇到过类似的事情?

编辑:

我还尝试设置stream_context参数(参数:SSL上下文选项):

$options['ssl']['verify_peer'] = false;
$options['ssl']['verify_peer_name'] = false;
$options['ssl']['allow_self_signed'] = true;

运气不好,它仍然失败,错误与上面指出的相同。

谢谢。


答案 1

PHP 5.6 引入了 SSL 证书验证,因此,如果您的配置损坏,它将失败并显示此错误。您应该修复 SSL,但可以通过将属性设置为不验证证书来恢复到旧行为:SMTPOptions

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

编辑库会破坏库的整个要点 - 如果你按照Kaf的答案建议去做,你的代码会在升级时中断。真的,不要那样做。

编者按:禁用SSL验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模拟受信任的终结点(例如 GitHub 或其他远程 Git 主机),并且您将容易受到中间人攻击在将其用作解决方案之前,请确保您完全了解安全问题。


答案 2

我有同样的问题。所以我在第238行更改了文件class.smtp.php:

public function connect($host, $port = null, $timeout = 30, $options = array()) {
       if (count($options) == 0) {
           $options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
       }

现在它工作正常!

编者按:禁用SSL验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模拟受信任的终结点(例如 GitHub 或其他远程 Git 主机),并且您将容易受到中间人攻击在将其用作解决方案之前,请确保您完全了解安全问题。


推荐