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

时间:2015-05-31 11:19:10

标签: laravel-4 amazon-ec2 ssl-certificate 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

我正在使用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' );
        } );

}
?>

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

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

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

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

12 个答案:

答案 0 :(得分:88)

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

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

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

答案 1 :(得分:27)

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

  

C:\ XAMPP \ htdocs中\ itis_​​db \厂商\ swiftmailer \ swiftmailer \ lib中\类\夫特\运输\ StreamBuffer.php

并在StreamBuffer.php中找到此函数

private function _establishSocketConnection()

并将此两行粘贴到此函数

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

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

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

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

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

答案 2 :(得分:17)

尝试更改app/config/email.php

smtpmail

答案 3 :(得分:7)

轻松修复此问题可能是编辑config / mail.php并关闭TLS

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

基本上这样做

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

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

  

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

答案 4 :(得分:3)

如何修复Laravel 7:

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

wget https://curl.haxx.se/ca/cacert.pem

编辑php.ini(您可以执行php --ini来查找),更新(或创建它们是否不存在)这两行:

curl.cainfo="/path/to/downloaded/cacert.pem"
...
openssl.cafile="/path/to/downloaded/cacert.pem"

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

重新启动PHP和Nginx / Apache。

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

source

答案 5 :(得分:1)

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

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

在极少数情况下,您可能想要禁用ssl安全功能,例如verify_peer,verify_peer_name或allow_self_signed。请对此非常小心,并且切勿在生产中使用。这只是临时测试的一种选择。

答案 6 :(得分:0)

阅读app / config / mailphp

Supported : "smtp", "mail", "sendmail"

根据计算机上安装的邮件实用程序,填写驱动程序密钥的值。我会做的

'driver' => 'sendmail',

答案 7 :(得分:0)

  

对于 Laravel 5.4
  用于 gmail


.env 文件中

MAIL_DRIVER=mail
MAIL_HOST=mail.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<username>@gmail.com
MAIL_PASSWORD=<password>
MAIL_ENCRYPTION=tls

config / mail.php

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

'from' => [
    'address' => env(
        'MAIL_FROM_ADDRESS', '<username>@gmail.com'
    ),
    'name' => env(
        'MAIL_FROM_NAME', '<from_name>'
    ),
],

答案 8 :(得分:0)

就我而言,我确实遵循了

$mail = new PHPMailer;
$mail->isSMTP();            
$mail->Host = '<YOUR HOST>';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = '<USERNAME>';
$mail->Password = '<PASSWORD>';
$mail->SMTPSecure = '';
$mail->smtpConnect([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);
$mail->smtpClose();

$mail->From = '<MAILFROM@MAIL.COM>';
$mail->FromName = '<MAIL FROM NAME>';

$mail->addAddress("<SENDTO@MAIL.com>", '<SEND TO>');

$mail->isHTML(true);
$mail->Subject= '<SUBJECTHERE>';
$mail->Body =  '<h2>Test Mail</h2>';
$isSend = $mail->send();

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

MAIL_ENCRYPTION=""

保存并尝试发送电子邮件

答案 11 :(得分:-1)

终于!这是我的 AVG 防病毒软件,它有一个称为电子邮件屏蔽的功能,将其禁用,错误消失了。