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

Posted

技术标签:

【中文标题】localhost 和“stream_socket_enable_crypto():SSL 操作失败,代码为 1”[重复]【英文标题】:localhost and "stream_socket_enable_crypto(): SSL operation failed with code 1" [duplicate] 【发布时间】:2017-11-09 10:09:57 【问题描述】:

我使用 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

【问题讨论】:

这意味着您的服务器配置错误,请为本地主机使用邮件陷阱或日志驱动程序,很高兴这不会在生产服务器上发生。在“stream_socket_enable_crypto(): SSL operation failed with code 1”周围搜索有那么难吗? 您应该为 localhost 创建一个格式正确的证书。另请参阅 How do you sign Certificate Signing Request with your Certification Authority 和 How to create a self-signed certificate with openssl? 您还需要将自签名证书放在适当的信任库中。 【参考方案1】:

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

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

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

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

【讨论】:

+1 表示不编辑供应商文件,这应标记为解决方案。也在 laravel 5.5 中工作过(Y) 请记住在复制粘贴时发布源代码,如果有人想为正确的回答者投票,请参阅this answer。 @VandolphReyes 不,不应该。此答案不会对已接受的答案已经回答的内容添加任何内容。 @Andrey,是的,你是对的。抱歉,我可能无法注意到他提供的链接。感谢您的提醒,虽然已经过去了几个月。 我是从 laracast 那里得到的,由于我没有发布源代码@Andrey 我对 *** 有点陌生,我应该在这里添加 laracast 的链接吗?【参考方案2】:

在 .htaccess 中添加以下内容

php_value openssl.cafile "cacert.pem 路径"

【讨论】:

【参考方案3】:

您好,我还发现这在服务器级别非常有用: 编辑 \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】:

在 Laravel 中:这将解决问题。 去\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php

内部方法 私有函数建立SocketConnection()

在这段代码之后

$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;

【讨论】:

【参考方案5】:

我遇到了同样的问题,并且能够通过删除一定级别的身份验证安全性来解决。也就是说,在某些时候,Gmail 要求我提供电话号码 - 二级身份验证。当我删除这个第 2 级时,我再次感到高兴。我希望我有所帮助。

【讨论】:

【参考方案6】:

这是您的 SSL 证书有误。您正在尝试使用没有正确证书的 SSL 连接(加密的安全连接)。

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

更多详情请见this link。

【讨论】:

添加这两行 $options['ssl']['verify_peer'] = FALSE; $options['ssl']['verify_peer_name'] = FALSE;在这个文件中:vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php 在函数_establishSocketConnection()中,但我当然不会在生产服务器中这样做 @Saucyloco - 我认为你几乎没有回避这个问题。你很幸运,因为它是localhost,所以邮件永远不会离开你的逻辑安全边界。在套接字上启用 TLS 可能会更好。 我做到了,正如我所说的它在生产中运行良好,我只在本地主机中遇到问题,当我上传页面时,我会删除这些行

以上是关于localhost 和“stream_socket_enable_crypto():SSL 操作失败,代码为 1”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用户'localhost'@'localhost'的访问被拒绝(使用密码:YES)在双版本Xampp和不同端口中

localhost,127.0.0.1 和 本机IP 三者的区别

UnknownEndpoint:无法访问的主机:“localhost”。尝试使用 express 和 dynamodb local 连接到 localhost

GET http://localhost:3000/:/localhost:4000 404(未找到)

localhost webapp 上的本地开发和 Cors 策略阻止的 localhost 访问

localhost 和 127.0.0.1 的区别