PHPMailer-SSL3_GET_SERVER_CERTIFICATE:证书验证失败


PHPMailer - SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

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

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参数(params:SSL上下文选项):

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

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

谢谢。

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主机),您将容易受到中间人攻击在将其用作解决方案之前,请确保您完全了解安全问题

我也有同样的问题。因此,我在第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主机),您将容易受到中间人攻击在将其用作解决方案之前,请确保您完全了解安全问题

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

smtpd_tls_CAfile=/etc/ssl/certs/intermediate-root-bundle.crt

尽管这个Postfix配置已经在Outlook和Thunderbird上使用了多年,但PHP更挑剔,没有通过SSL检查。

因此,即使你可能会想破解PHPMailer,请不要这样做,并解决潜在的问题。

我只想投入我的2美分,因为我已经找了好几天的修复程序,直到我尝试了Kaf的解决方案,它才奏效!!感谢@Kaf

无论如何。。。对我来说,PHPMailer一直工作得很好,直到我决定将PHP升级到PHP5.6

在PHP 5.6中对打开ssl进行了更改。以下是官方文档:

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

从文档中,它说要将verify_peervalid_peer_name设置为false

所以,只要按照Kaf的回答,看看这对你是否有效。

编者按 :医生还说不建议这样做!禁用SSL验证会带来安全隐患如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟受信任的端点(如GitHub或其他远程Git主机),您将容易受到中间人攻击在将其用作解决方案之前,请确保您完全了解安全问题