PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败

Posted

技术标签:

【中文标题】PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败【英文标题】:PHPMailer - SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 【发布时间】:2015-01-05 18:38:07 【问题描述】:

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

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;

不走运,它仍然失败并出现与上述相同的错误。

谢谢。

【问题讨论】:

可能是服务器不支持 SSLv3(在 POODLE hack 之后)。我不确定如何将客户端配置为不尝试 SSL,而是从一开始就使用 TLS。 我正在使用 PHPMailer,TLS 模式不是 SSL。 【参考方案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 主机),您将容易受到Man-in-the-Middle Attack 的攻击。 在将其用作解决方案之前,请确保您完全了解安全问题。

【讨论】:

我在哪里编辑这个文件?我用的是linux,我不知道在哪里找到这个 这将在您自己的脚本中,无论您从哪里调用 PHPMailer。 感谢您的回答,但是如何解决这个问题,而不是忽略它?我已阅读故障排除指南,但它说“正确的解决方法是用一个好的证书替换无效、配置错误或自签名的证书。”,我是这一切的新手,我在哪里可以获得有关解决问题的更多详细信息issue ,而不是忽略它,任何链接或文章都会很棒。我得到了说我需要安装 SSL 证书的部分,但是在哪里以及如何安装? 它与 Web 服务器的 SSL 证书相同 - 它需要匹配域,由受信任的 CA 签名(即非自签名),并且应该具有 SHA2 哈希并使用2048 位密钥。您如何安装它取决于您的特定服务器 - 它会在其文档中告诉您。 谢谢@Synchro。我还需要更新 PHPMailer 包。【参考方案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 主机),您将容易受到Man-in-the-Middle Attack 的攻击。 在将其用作解决方案之前,请确保您完全了解安全问题。

【讨论】:

connect 函数采用 options 数组参数是有原因的 - 它允许您设置它而无需更改库。 我认为这会使网站变得不安全,对吧? 它不会使整个网站不安全,但意味着它可以被假邮件服务器欺骗,并且收到的邮件更有可能被归类为垃圾邮件。 好的,谢谢,我找到了另一种方法。此方法不安全,您禁用了安全性。 切换到邮件传输并不能解决问题,它只是将它移动到其他地方。请不要赞成这个答案,因为它暗示了实施解决方案的根本错误方式。【参考方案3】:

我遇到了同样的问题。原来我的 Postfix 配置缺少中间证书和根证书设置:

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

尽管这个 Postfix 配置已经在 Outlook 和 Thunderbird 上运行了多年,但 PHP 更加挑剔并且未能通过 SSL 检查。

因此,即使您可能想破解 PHPMailer,请不要这样做,并解决根本问题。

【讨论】:

【参考方案4】:

我只是想投入 2 美分,因为我几天来一直在寻找解决方案,直到我尝试了 Kaf 的解决方案并且它奏效了!!谢谢@Kaf

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

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

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

从文档中说将 verify_peerverify_peer_name 设置为 false

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

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

【讨论】:

不,不要遵循 Kaf 的回答 - 遵循我的,它可以在不破坏您升级 PHPMailer 的能力的情况下达到同样的效果。

以上是关于PHPMailer - SSL3_GET_SERVER_CERTIFICATE:证书验证失败的主要内容,如果未能解决你的问题,请参考以下文章

phpmailer无法发送电子邮件

PHPMailer:替换默认的messageID

PHP 通过PHPMailer发送邮件

PHP 通过PHPMailer发送邮件

php [php:PHPMailer示例] php库“PHPMailer”示例。 #PHP

phpmailer 发送邮件