PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败

时间:2014-11-09 10:28:19

标签: php phpmailer

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

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 context options):

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

没有运气,它仍然失败并出现与上述相同的错误。

感谢。

4 个答案:

答案 0 :(得分:84)

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主机),您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。

答案 1 :(得分:20)

我有同样的问题。所以我改变了第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主机),并且您将容易受到Man-in-the-Middle Attack的攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。

答案 2 :(得分:2)

我遇到了同样的问题。事实证明,我的Postfix配置缺少中间体和根证书设置:

var ages = person.Select(r => r.Age).Distinct();
foreach (int age in ages)
{
    int new_rank = new Random().Next(1, 5);
    person.ForEach(p => { if (p.Age == age) { p.Rank = new_rank; } });
}

尽管这个Postfix配置已经与Outlook和Thunderbird合作多年,但PHP更挑剔并且无法通过SSL检查。

所以即使你可能想要破解PHPMailer,也请不要,并解决潜在的问题。

答案 3 :(得分:0)

只是想把我的2美分放入,因为我一直在寻找修复,直到我尝试了Kaf的解决方案并且它有效!谢谢@Kaf

无论如何......对我来说,PHPMailer工作正常,直到我决定将PHP升级到PHP5.6

在PHP 5.6中对open ssl进行了更改。这是官方文档:

http://php.net/manual/en/migration56.openssl.php

从文档中说明将 verify_peer verify_peer_name 设置为 false

所以,只需按照Kaf的回答,看看它是否适合你。

  

编辑注释 :该文档还说不建议这样做!禁用SSL验证具有安全隐患。如果不验证SSL / HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),您将成为易受Man-in-the-Middle Attack攻击。 在将此作为解决方案使用之前,请确保完全了解安全问题。