Php 如何修复流\u套接字\u启用\u加密():SSL操作失败,代码为1

Php 如何修复流\u套接字\u启用\u加密():SSL操作失败,代码为1,php,amazon-ec2,laravel-4,ssl-certificate,apache2.4,Php,Amazon Ec2,Laravel 4,Ssl Certificate,Apache2.4,Im使用Laravel4.2、PHP5.6、Apache2.4 我在AmazonEC2Linux中安装了GoDaddySSL 当我使用https访问站点时,SSL工作正常 调用函数时出错: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certific

Im使用Laravel4.2、PHP5.6、Apache2.4

我在AmazonEC2Linux中安装了GoDaddySSL

当我使用https访问站点时,SSL工作正常

调用函数时出错:

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

我读了一些关于这方面的文章,他们说有些事情我们应该做一些修改,他们把代码放在哪里,但我不知道在哪里插入它

我一直在读:

这是很难理解的php文档


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

尝试更改
app/config/email.php

smtp
mail

编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击

在将其用作解决方案之前,请确保您完全了解安全问题。 我在Laravel4.2中也有这个错误,我是这样解决的。查找
StreamBuffer.php
。对我来说,我使用xampp,我的项目名是itis_db,我的路径是这样的。所以,试着根据你的答案去寻找

C:\xampp\htdocs\itis\u db\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php

<?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' );
        } );

}
?>
并在StreamBuffer.php中找到此函数

<?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' );
        } );

}
?>
并将这两行粘贴到此函数内

private function _establishSocketConnection()
然后重新加载浏览器并尝试再次运行项目。对我来说,我穿的是这样的:

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
希望你能解决这个问题

编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击

在将其用作解决方案之前,请确保您完全了解安全问题。 解决这个问题的简单方法可能是编辑config/mail.php并关闭TLS

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;
}
基本上是这样做的

'encryption' => env('MAIL_ENCRYPTION', ''), //'tls'),

您也应该放松安全性,但在第一个选项中,不需要深入研究供应商的代码。

阅读app/config/mailphp

$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
根据计算机上安装的邮件实用程序,填写驱动程序密钥的值。我愿意

Supported : "smtp", "mail", "sendmail"
编者按:禁用SSL验证具有安全隐患。如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以模拟Gmail等受信任端点,您将容易受到攻击

在将其用作解决方案之前,请确保您完全了解安全问题。 您可以在/config/mail.php中添加以下代码(在laravel 5.1、5.2、5.4上测试和使用)


要解决此问题,首先需要检查所连接主机的SSL证书。例如使用或。就我而言,中级证书是错误的

如果证书正常,请确保服务器上的openSSL是最新的。运行
openssl-v
检查您的版本。可能您的版本太旧,无法使用证书

在非常罕见的情况下,您可能希望禁用ssl安全功能,如verify_peer、verify_peer_name或allow_self_signed。请非常小心,不要在生产中使用。这只是临时测试的一个选项

对于Laravel 5.4
对于gmail


.env文件中

'stream' => [
   'ssl' => [
      'allow_self_signed' => true,
      'verify_peer' => false,
      'verify_peer_name' => false,
   ],
],
MAIL\u DRIVER=MAIL
MAIL\u HOST=MAIL.gmail.com
邮件端口=587
MAIL_USERNAME=@gmail.com
邮箱密码=
邮件加密=tls

config/mail.php中

MAIL_DRIVER=mail
MAIL_HOST=mail.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<username>@gmail.com
MAIL_PASSWORD=<password>
MAIL_ENCRYPTION=tls
'driver'=>env('MAIL\u driver','MAIL'),
'来自'=>[
'地址'=>环境(
“从地址发送邮件”,“@gmail.com”
),
'name'=>env(
“从您的姓名处发送邮件”
),
],

在我的情况下,我做了以下几点

'driver' => env('MAIL_DRIVER', 'mail'),

'from' => [
    'address' => env(
        'MAIL_FROM_ADDRESS', '<username>@gmail.com'
    ),
    'name' => env(
        'MAIL_FROM_NAME', '<from_name>'
    ),
],
$mail=新的PHPMailer;
$mail->isSMTP();
$mail->Host='';
$mail->Port=587;
$mail->SMTPAuth=true;
$mail->Username='';
$mail->Password='';
$mail->SMTPSecure='';
$mail->smtpConnect([
“ssl”=>[
“验证对等方”=>false,
'verify_peer_name'=>false,
“允许自签名”=>true
]
]);
$mail->smtpClose();
$mail->From='';
$mail->FromName='';
$mail->addAddress(“,”);
$mail->isHTML(true);
$mail->Subject='';
$mail->Body='testmail';
$isSend=$mail->send();

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

$default = [ ... ];

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

$environment = env('APP_ENV');

if ($environment === 'local') {
    return array_merge($default, $turnOffSSL);
}

return $default;

保存并尝试发送电子邮件

如何修复Laravel 7:

从下载最新的文件

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

wget https://curl.haxx.se/ca/cacert.pem
这些行应该已经存在,但已注释掉,因此取消注释它们,并使用下载的
cacert.pem

重新启动PHP和Nginx/Apache

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


Laravel框架问题,更改协议删除了问题。现在它没有抛出错误,但在将其更改为“邮件”后,我没有收到邮件,而是显示为在我的应用程序中发送的邮件,这可能是什么问题?将此更改为邮件将直接从服务器发送邮件,而不是连接到smtp服务器!这是一个非常糟糕的答案,因为它没有描述这种变化的后果。通过SMTP发送电子邮件时,laravel会登录到您的服务器,并代表您发送和发送电子邮件。如果您将其更改为“邮件”,它将通过PHP邮件发送邮件,这意味着它将受到更高的垃圾邮件分数的影响,因为PHP本质上是在欺骗电子邮件。您可以使用PHP邮件从发送电子邮件bill@microsoft.com如果你愿意的话。但它们最终可能会变成垃圾邮件。更多信息请点击这里。回答正确!Th
MAIL_ENCRYPTION=""
wget https://curl.haxx.se/ca/cacert.pem
curl.cainfo="/path/to/downloaded/cacert.pem"
...
openssl.cafile="/path/to/downloaded/cacert.pem"