PHPMailer – SSL3_GET_SERVER_CERTIFICATE:证书validation失败

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

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

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

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

谢谢。

PHP 5.6引入了SSL证书validation,所以如果你的configuration被破坏,它将会失败,并出现这个错误。 您应该修复SSL,但可以通过将SMTPOptions属性设置为不validation证书来恢复旧的行为:

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

编辑图书馆会影响图书馆的整个工作 – 如果你按照Kaf的回答build议,你的代码将在你升级时破坏。 真的,不要这样做。

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

 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); } 

现在它工作正常!

我的答案指的是@Synchro,我把这个代码放到我的邮件中,现在它的工作正常,TY。

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

只是想把我的2美分,因为我一直在寻找修复几天,直到我试过卡夫的解决scheme,它的工作! 谢谢@卡夫

反正…对我来说,PHPMailer工作正常,直到我决定升级PHP到PHP5.6

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

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

从文档说,将verify_peerverify_peer_name设置为false

所以只要按照Kaf的答案,看看是否适合你。

我有同样的问题。 原来,我的Postfixconfiguration缺less中间体和根证书设置:

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

即使这个Postfixconfiguration与Outlook和Thunderbird一起工作了多年,PHP也更挑剔,SSL检查失败。

所以,尽pipe你可能会试图破解PHPMailer,但请不要这样做,并解决底层的问题。