localhost和“stream_socket_enable_crypto():SSL操作失败,代码为1”

时间:2017-06-07 21:29:28

标签: php laravel email laravel-5.2

我正在使用Gmail发送电子邮件,一切都运行得很好,但突然之间停止了工作。它告诉我这个

ErrorException in StreamBuffer.php line 94:

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 StreamBuffer.php line 94
at HandleExceptions->handleError('2', 'stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed', 'C:\xampp\htdocs\coparmex\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php', '94', array())
at stream_socket_enable_crypto(resource, true, '9') in StreamBuffer.php line 94
at Swift_Transport_StreamBuffer->startTLS() in EsmtpTransport.php line 313
at Swift_Transport_EsmtpTransport->_doHeloCommand() in AbstractSmtpTransport.php line 118
at Swift_Transport_AbstractSmtpTransport->start() in Mailer.php line 79
at Swift_Mailer->send(object(Swift_Message), array()) in Mailer.php line 385
at Mailer->sendSwiftMessage(object(Swift_Message)) in Mailer.php line 171

这只发生在我的localhost中,在web主机上运行正常。我不明白发生了什么:c

这些是我的Gmail设置

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=gmail
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls

6 个答案:

答案 0 :(得分:30)

您应该在/config/mail.php中添加以下代码(在laravel 5.4上工作)

'stream' => [
'ssl' => [
    'allow_self_signed' => true,
    'verify_peer' => false,
    'verify_peer_name' => false,
],
],

因为你不应该按照Sultan Ahmad的建议改变供应商的代码

  

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

答案 1 :(得分:9)

您的SSL证书出错。您尝试在没有适当证书的情况下使用SSL连接(加密,安全连接)。

那是因为您从localhost连接,这是不安全的,并且被连接阻止。您可以通过将localhost连接更改为基于SSL的连接来避免这种情况。

有关详细信息,请参阅this link

答案 2 :(得分:1)

我遇到了同样的问题,并且能够通过删除一定级别的身份验证安全性来解决问题。也就是说,Gmail在某些时候向我询问了电话号码 - 第二级身份验证。当我删除这个第二级时,我又开心了。我希望我有所帮助。

答案 3 :(得分:0)

嗨,我还发现这在服务器级别上非常有用: 编辑 \ vendor \ swiftmailer \ lib \ classes \ Swift \ Transport \ StreamBuffer.php 259行。注释掉$ options = array();并添加以下内容。

$options = array(); 
$options['ssl'] = array('verify_peer' => false,
'verify_peer_name' => false, 'allow_self_signed' => true);

与Laravel 6.0一起使用

答案 4 :(得分:0)

在.htaccess中添加以下内容

php_value openssl.cafile“ cacert.pem的路径”

答案 5 :(得分:-1)

<\ n>在Laravel:这将解决问题。 转到\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php

内部方法 私有函数establishSocketConnection()

在此代码之后

$options = array();
        if (!empty($this->params['sourceIp'])) {
            $options['socket']['bindto'] = $this->params['sourceIp'].':0';
        }

然后添加这两行

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;