PHP 5.6.8 认证验证失败


PHP 5.6.8 cerficate verification failure

平台: Ubuntu14.04 + xampp 5.5.24 '' 5.6.8 + openssl

从 phpmailer 发送电子邮件时出现错误消息:

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 /opt/lampp/htdocs/Sentrifugo_2.0/install/PHPMailer/class.smtp.php on line 270

在我读到的一些博客上,我们可以通过SMTPOptions允许不安全的连接,并通过使用以下方式对SMTP类进行子类化来实现它:

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

如果有人可以支持确认我应该在哪里配置它,我将不胜感激,因为我已经搜索了class.smtp.php和class.phpmailer.php文件,但找不到verify_peer。

另外,在第 270 行,我在 class.smtp.php 中找到了以下代码:

/**
 * Initiate a TLS (encrypted) session.
 * @access public
 * @return bool
 */
public function startTLS()
{
    if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
        return false;
    }
    // Begin encrypted connection
    if (!stream_socket_enable_crypto(
        $this->smtp_conn,
        true,
        STREAM_CRYPTO_METHOD_TLS_CLIENT
    )) {
        return false;
    }
    return true;
}

请建议 - 提前感谢

这在 PHPMailer 故障排除指南中有介绍。

你把事情搞混了。在旧版本的 PHPMailer 中,您只能通过子类化来传递 ssl 设置来解决此问题,但现在您可以通过您发布的代码来完成:

$mail->SMTPOptions = [
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
];

这将设置 PHPMailer 的 SMTPOptions 属性,该属性将传递给 stream_socket_client 函数。PHPMailer 本身没有verify_peer属性 - 它是 PHP 中流上下文的 SSL 属性中的一个设置。

调用startTLS()时,流已经附加了上下文,因此当调用stream_socket_enable_crypto时,它将利用创建流时在流上设置的 SSL 属性。

请记住,当您选择采用这种禁止证书验证的途径时,您正在危及安全性。

警告

在两个不同的域上使用两个不同的帐户的PHPMailer,两个密码都被盗了。

代码

require 'php_libraries/php_mailer/Exception.php';
require 'php_libraries/php_mailer/PHPMailer.php';
require 'php_libraries/php_mailer/SMTP.php';
use PHPMailer'PHPMailer'PHPMailer;
use PHPMailer'PHPMailer'Exception;
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.office365.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = "from@domain.com";
$mail->Password = "password";
//From
$mail->setFrom('from@domain.com', 'No Reply');
//To
$mail->addAddress("to@domain.com", "user");
$mail->Subject = "Subject";
$mail->addAttachment("C:''xampp''htdocs''oasis''excelReport''test.xlsx");
$mail->Body = "body";
$mail->SMTPOptions = array('ssl' => array('verify_peer' => false,'verify_peer_name' => false,'allow_self_signed' => true));
if (!$mail->send())
{
    $result="error";
}
else
{
    $result="ok";
}
echo $result;