Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php cURL错误60:Laravel 5.4中的SSL证书_Php_Curl_Laravel 5 - Fatal编程技术网

Php cURL错误60:Laravel 5.4中的SSL证书

Php cURL错误60:Laravel 5.4中的SSL证书,php,curl,laravel-5,Php,Curl,Laravel 5,完全错误 CurlFactory.php第187行中的RequestException:cURL错误60:SSL证书问题:无法获取本地颁发者证书(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html) 场景 在有人告诉我这两个答案之前: 我已经看过了,这就是我来这里的原因 我遇到的问题是,现在我有了cacert.pem文件,但放在哪里没有意义,答案表明要将该文件放在我的xampp目录中,并更改我的php.ini文件,但我没有使用xampp做任

完全错误

CurlFactory.php第187行中的RequestException:cURL错误60:SSL证书问题:无法获取本地颁发者证书(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)

场景

在有人告诉我这两个答案之前:

我已经看过了,这就是我来这里的原因

我遇到的问题是,现在我有了cacert.pem文件,但放在哪里没有意义,答案表明要将该文件放在我的xampp目录中,并更改我的
php.ini
文件,但我没有使用xampp做任何事情,我使用的是Laravel的artisan服务器来运行我的项目

如果未使用xampp,则应将此文件放在何处?此外,为什么一个公认的答案是将它放在我的xampp目录中?我不明白

我的确切问题


我应该将
cacert.pem
文件放在何处以停止laravel 5.4中的此错误?

这是一个很难解决的问题,但以下是使用laravel并有此问题的用户的确切答案

我的确切应用程序版本是

拉雷维尔:5.4

Guzzle http:6.2

拉威尔社交名流:3.0

从以下链接下载此证书的新副本:

从laravel应用程序的基本根目录开始,在此路径中保存文件
vendor/guzzlehttp/guzzle/src/cacert.pem

接下来在同一个目录中打开
RequestOptions.php
,向下滚动到名为
CERT
的常量,并将其更改为this
const CERT='cacert.pem'这应该可以解决所有问题

编辑


正如人们指出的那样,您永远不应该编辑供应商文件夹,这只是我在业余时间构建的应用程序的一个快速修复。这并不是什么重要的事情,比如我公司的一个应用程序或者其他什么,使用这种方法的风险自负!如果你需要更具体的答案,请查看其他答案。

最近另一个答案问了同样的问题,我的答案似乎是他解决问题的答案。 以下是我提到的帖子:

我就是这么说的:

老实说,我对拉威尔一无所知。但是我有 和其他许多问题一样,Symfony也面临同样的问题。就在你说的时候,我试过了 很多事情都没有成功

最后,这个解决方案对我起了作用:

它表示可能出现证书问题,而不是证书问题 来自一个不兼容的环境。我使用XAMPP而不是 WAMP成功了


对于Laravel:下面的5个步骤将非常有用

  • 将版本更新为
    Guzzlehttp:5.2
  • \vendor\guzzlehttp\guzzle\src\Client.php
  • 将默认设置编辑为

    受保护的函数getDefaultOptions(){ $settings=[ “允许重定向”=>true, “例外情况”=>true, “解码内容”=>true, 'verify'=>getcwd()。/vendor/guzzlehttp/guzzle/src/cacert.pem' ]; }

  • http://curl.haxx.se/ca/cacert.pem
    并置于
    /vendor/guzzle http/guzzle/src/


永远不要修改
供应商/
文件夹中的文件。曾经它们可以并且将在下次运行composer更新时被覆盖

这是我针对WampServer的解决方案

我的WampServer使用的是PHP7.1.9,因此将下面示例中的
7.1.9
更改为当前使用的版本号

  • 下载此文件:
  • 将此文件放在
    C:\wamp64\bin\php\php7.1.9
    文件夹中
  • 打开
    php.ini
    并找到以下行:
  • ;curl.cainfo

    将其更改为:

    curl.cainfo=“C:\wamp64\bin\php\php7.1.9\cacert.pem”

    确保删除行开头的分号


    将更改保存到
    php.ini
    ,重新启动WampServer,就可以开始了

    快速解决方案,但不安全(不推荐

    使用卷曲

    Set CURLOPT_SSL_VERIYPEER to false
    
    使用Guzzle:例如,将verify设置为false

    $client->request('GET', 'https://somewebsite.com', ['verify' => false]);
    
    • 一些用户建议更改
      \vendor\guzzlehttp\guzzle\src\Client.php
      文件的解决方案是最糟糕的建议,因为如果运行
      composer update
      命令,对vendor文件夹所做的手动更改将被覆盖
    • 建议的解决方案是一个肮脏的速记修复,但不建议在生产应用程序中使用
    • 如果您可以访问web服务器上的
      php.ini
      文件,则建议的解决方案是完美的。如果您使用的是共享主机,则可能无法编辑
      php.ini
      文件

    当您无法访问
    php.ini
    文件时(例如共享主机)

  • 下载此文件:或
  • 将此文件放在Laravel项目的根文件夹中
  • verify
    键添加到
    GuzzleHttp\Client
    构造函数,其值作为
    cacert.pem
    文件的路径
  • 使用Laravel 5.7和GuzzleHttp 6.0

    // https://example.com/v1/current.json?key1=value1&key2=value2
    
    $guzzleClient = new GuzzleHttp\Client([
        'base_uri' => 'https://example.com',
        'verify' => base_path('cacert.pem'),
    ]);
    
    $response = $guzzleClient->get('v1/current.json', [
        'query' => [
            'key1' => 'value1',
            'key2' => 'value2',
        ]
    ]);
    
    $response = json_decode($response->getBody()->getContents(), true);
    

    我在运行Valet并尝试从Valet中的一个站点到另一个站点创建api时遇到了这个问题。 请注意,我在OSX中工作。 我在这里找到了解决方案: 简而言之,您必须将代客泊车pem复制到系统CA捆绑包中。 只需运行以下命令:

    cp /usr/local/etc/openssl/cert.pem /usr/local/etc/openssl/cert.pem.bak && cat ~/.config/valet/CA/LaravelValetCASelfSigned.pem >> /usr/local/etc/openssl/cert.pem
    

    我正在从域X发送一个请求到Y,我的问题是在域Y上使用的证书(顺便说一句,它不是自签名证书),该域属于我&我有证书,所以快速修复方法是在域X的应用程序上使用域Y的证书:

    在域X上:

    Set CURLOPT_SSL_VERIYPEER to false
    
    • 使用Laravel 7 HTTP包装器:

      \Http::withOptions(['verify'=>'path-to-domain-Y-certificate'