本地主机和“stream_socket_enable_crypto():SSL操作失败,代码为1”

16
我之前一直使用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

这只在我的本地主机上发生,而在网络主机上却可以正常工作。我不明白出了什么问题 :c

以下是我的 Gmail 设置

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

这意味着您的服务器配置错误,请使用mailtrap或localhost的日志驱动程序,感到高兴的是,这不会发生在生产服务器上。难道要在谷歌上搜索“stream_socket_enable_crypto():SSL操作失败,代码1”吗? - Kyslik
你应该为本地主机创建一个格式良好的证书。另请参阅如何使用您的认证机构签署证书签名请求如何使用openssl创建自签名证书? 您还需要将自签名证书放置在适当的信任存储中。 - jww
6个回答

40
编辑说明:禁用SSL验证会带来安全隐患。如果没有对SSL/HTTPS连接的真实性进行验证,恶意攻击者可以冒充受信任的终端点(如GitHub或其他远程Git主机),您将容易受到中间人攻击。在使用此解决方案之前,请确保您充分了解安全问题。

您应该在/config/mail.php中添加以下代码(适用于laravel 5.4)

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

正如Sultan Ahmad建议的那样,您不应该更改供应商代码。


1
+1 表示不编辑供应商文件,并将其标记为解决方案。在 Laravel 5.5 中也可以工作 (Y) - Rajendran Nadar
4
请记得在复制粘贴时发布来源,如果有人想要为正确的回答者投票,请查看此答案。@VandolphReyes 不应该这样做。这个答案没有为被接受的答案提供任何额外的信息。 - user8104581
@Andrey,是的,你说得对。抱歉,我可能没有注意到他提供的链接。虽然已经过了几个月,但还是谢谢你提醒我。 - Vandolph Reyes
我是从Laracast上得到的,因此我没有发布源代码@Andrey。我对stackoverflow还比较新,我应该在这里添加Laracast的链接吗? - anon

10

你的SSL证书有错误。你试图在没有正确证书的情况下使用SSL连接(加密、安全连接)。

这是因为你正在从本地主机连接,这不是安全的,所以连接被阻止了。你可以通过将本地主机连接更改为基于SSL的连接来避免这种情况。

了解更多细节,请查看此链接


2
在文件:vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php中的函数_establishSocketConnection()中添加以下两行代码:$options['ssl']['verify_peer'] = FALSE; $options['ssl']['verify_peer_name'] = FALSE;这样可以解决问题,但在生产服务器上不建议这么做。 - Saucyloco
@Saucyloco - 我认为你勉强回避了这个问题。你很幸运,因为它是“localhost”,所以邮件从未离开你的逻辑安全边界。最好在套接字上保留TLS启用。 - jww
我已经这样做了,就像我说的那样,在生产环境中它运行良好,我只在本地主机上遇到了问题,当我上传页面时,我将删除那些行。 - Saucyloco

1

嗨,我也发现在服务器级别上这非常有用: 编辑\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 的工作。

0

我曾经遇到同样的问题,通过删除一层身份验证安全性得以解决。也就是说,在某个时候 Gmail 要求我提供电话号码 - 第二层身份验证。当我删除了这第二层身份验证后,问题得到了解决。希望我的回答能够帮到你。


-1
在Laravel中:这将解决问题。 前往\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php 在方法 private function 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;

-1
在 .htaccess 文件中添加以下内容:

php_value openssl.cafile "cacert.pem 文件的路径"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接