如何修复stream_socket_enable_crypto():SSL操作失败,代码为1

39 amazon-ec2 ssl-certificate laravel-4 apache2.4 php-5.6

stream_socket_enable_crypto(): SSL operation failed with code 1. 
OpenSSL Error messages: error:14090086:SSL 
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)

我使用的是Laravel 4.2,PHP 5.6,Apache 2.4

我在Amazon ec2 Linux中安装了GoDaddy SSL.

当我使用https访问该网站时,SSL工作正常.

我调用我的函数时发生错误:

<?php

public function sendEmail() 
{
        \Mail::send ( 'emails.code.code', $data, function ($sendemail) use($email) {
            $sendemail->from ( 'info@me.com', 'Me Team' );
            $sendemail->to ( $email, '' )->subject ( 'Activate your account' );
        } );

}
?>
Run Code Online (Sandbox Code Playgroud)

我读了一些关于这个的文章,他们说有些东西我们应该做一些改变,他们把那些代码但是我不知道在哪里插入它.

读过这篇文章:https://www.mimar.rs/en/sysadmin/2015/php-5-6-x-ssltls-peer-certificates-and-hostnames-verified-by-default/

http://php.net/manual/en/migration56.openssl.php这个文档很难理解.

所以我的问题是如何解决这个问题?

小智 106

您应该在/config/mail.php中添加以下代码(在laravel 5.1,5.2,5.4上测试并使用)

'stream' => [
   'ssl' => [
      'allow_self_signed' => true,
      'verify_peer' => false,
      'verify_peer_name' => false,
   ],
],
Run Code Online (Sandbox Code Playgroud)

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

  • 在 Laravel 7.x 中,配置已移至“mail.mailers.smtp.stream” (7认同)
  • 请注意,这对于测试服务器是可以的,但不应该在生产中使用,因为它不安全. (3认同)
  • 我在 .env 文件中添加了下面的代码,加上你提出的更改,现在它正在工作(我使用的是 Laravel 5.3),谢谢 o/ MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=test@ gmail.com MAIL_PASSWORD=密码 MAIL_ENCRYPTION=tls (2认同)

Hum*_*yan 30

我在laravel 4.2中也有这个错误,我这样解决了.找出答案StreamBuffer.php.对我来说,我使用xampp,我的项目名称是itis_​​db,因为我的路径是这样的.所以试着根据你的那个找到

C:\ XAMPP\htdocs中\ itis_​​db \供应商\ swiftmailer\swiftmailer\LIB \类\雨燕\传输\ StreamBuffer.php

并在StreamBuffer.php中找到此函数

private function _establishSocketConnection()
Run Code Online (Sandbox Code Playgroud)

并将此两行粘贴到此函数内

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
Run Code Online (Sandbox Code Playgroud)

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

并重新加载您的浏览器并尝试再次运行您的项目.对我来说,我穿上这样:

private function _establishSocketConnection()
{
    $host = $this->_params['host'];
    if (!empty($this->_params['protocol'])) {
        $host = $this->_params['protocol'].'://'.$host;
    }
    $timeout = 15;
    if (!empty($this->_params['timeout'])) {
        $timeout = $this->_params['timeout'];
    }
    $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;

    $this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
    if (false === $this->_stream) {
        throw new Swift_TransportException(
            'Connection could not be established with host '.$this->_params['host'].
            ' ['.$errstr.' #'.$errno.']'
            );
    }
    if (!empty($this->_params['blocking'])) {
        stream_set_blocking($this->_stream, 1);
    } else {
        stream_set_blocking($this->_stream, 0);
    }
    stream_set_timeout($this->_stream, $timeout);
    $this->_in = &$this->_stream;
    $this->_out = &$this->_stream;
}
Run Code Online (Sandbox Code Playgroud)

希望你能解决这个问题.....

  • Downvote是因为您不应该编辑供应商代码.首先,你将放弃任何作曲家更新的所有更改.第二 - 供应商不是(也不应该)添加到控制版本,因此团队中的任何人都不会得到这种改变.更好的方法是创建自己的类,扩展现有的供应商类. (3认同)
  • 您的软件刚刚列出[世界上最危险的代码:在非浏览器软件中验证SSL证书](http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html ). (3认同)

小智 18

尝试改变 app/config/email.php

smtpmail

  • 将其更改为邮件直接从服务器发送邮件,而不是连接到smtp服务器! (7认同)
  • 这是一个非常糟糕的答案,因为它没有描述这种变化的后果.通过SMTP laravel日志将电子邮件发送到您的服务器并代表您发送和发送电子邮件.如果您将其更改为"邮件",它将通过PHP邮件发送邮件,这意味着它将受到更高的垃圾邮件分数,因为PHP本质上是欺骗电子邮件.如果需要,您可以使用PHP邮件从bill@microsoft.com发送电子邮件.但他们可能最终会陷入垃圾邮件.更多信息在这里.https://www.jvfconsulting.com/blog/php-mail-function-vs-smtp-guaranteed-delivery/ (4认同)
  • 关于电子邮件欺骗,这就是为什么有SPF和DKIM记录,与是否PHP或其他东西发送电子邮件无关。如果您的域设置正确,那么只要您使用正确的域,通过 SMTP 或 PHP 发送它是相同的。 (2认同)

Mtx*_*txz 9

如何修复 Laravel 7 或 Laravel 6(未在其他版本上测试,但应该可以工作):

cURL 网站下载最新的cacert.pem文件。

wget https://curl.haxx.se/ca/cacert.pem
Run Code Online (Sandbox Code Playgroud)

编辑 php.ini(您可以php --ini找到它),更新(如果它们不存在,则创建)这两行:

curl.cainfo="/path/to/downloaded/cacert.pem"
...
openssl.cafile="/path/to/downloaded/cacert.pem"
Run Code Online (Sandbox Code Playgroud)

这些行应该已经存在但已注释掉,因此取消注释它们并使用下载的路径编辑这两个值 cacert.pem

重启 PHP 和 Nginx/Apache。

编辑:您可能需要 chown/chmod 下载的证书文件,以便 PHP(及其用户)可以读取它。

来源


小智 8

对此进行简单修复可能是编辑config/mail.php并关闭TLS

'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),
Run Code Online (Sandbox Code Playgroud)

基本上这样做

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
Run Code Online (Sandbox Code Playgroud)

您也应该放松安全性,但在第一个选项中,无需深入了解供应商的代码.

编者注:正如作者所说:禁用SSL验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题.

  • 您的软件刚刚在[世界上最危险的代码:验证非浏览器软件中的SSL证书]中列出了该列表(http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html )。 (2认同)
  • 我正在使用此答案中的解决方案来测试通过Mailgun沙箱的电子邮件,并且它完美地运行.但是,我不建议将其用于生产邮件. (2认同)

Som*_*atd 8

编辑您的 .env 并在邮件配置行之后添加此行

MAIL_ENCRYPTION=""
Run Code Online (Sandbox Code Playgroud)

保存并尝试发送电子邮件


Oma*_*mar 5

最后!这是我的 AVG 防病毒软件,它有一个名为“电子邮件防护”的功能,禁用它后错误就消失了。

  • 您无需完全禁用 Email Shield。在 AVG 中,选择“Web 和电子邮件”&gt;“设置”(右上角的齿轮图标)&gt;“电子邮件防护”,然后取消选择“扫描出站电子邮件 (SMTP)”。 (2认同)

VKG*_*KGS 5

对于 Laravel 9,以下内容足以禁用 ssl 检查:

 'verify_peer'       => false,
Run Code Online (Sandbox Code Playgroud)

示例:
// config/mail.php

'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode'  => null,
            'verify_peer' => false,
        ],
        ...
Run Code Online (Sandbox Code Playgroud)