cURL错误60:Laravel 5.4

时间:2017-02-07 16:19:07

标签: php curl laravel-5.3

完整错误

RequestException in CurlFactory.php line 187: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

方案

在有人向我指出这两个laracasts答案之前:https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate

https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/replies/52954

我已经看过他们了,这就是为什么我在这里,

我遇到的问题是我现在有cacert.pem文件但是它放在哪里没有意义,答案表明将文件放在我的xampp目录中并更改我的php.ini文件但是我没有使用xampp的任何东西,我使用laravel的工匠服务器来运行我的项目。如果没有使用xampp,那么我在哪里放置此文件&更多,那么为什么一个公认的答案是将它放在我的xampp目录中我不明白

我的确切问题

我在哪里放置cacert.pem文件以在laravel 5.4中停止此错误?

12 个答案:

答案 0 :(得分:53)

不要修改vendor/文件夹中的文件。永远。它们可以并且将在您运行的下一个作曲家更新中被覆盖。

这是我的WampServer解决方案

我正在使用PHP 7.1.9作为我的WampServer,因此请将以下示例中的7.1.9更改为您当前使用的版本号。

  1. 下载此文件:http://curl.haxx.se/ca/cacert.pem
  2. 将此文件放在C:\wamp64\bin\php\php7.1.9文件夹
  3. 打开php.ini并找到以下行:
  4. ;curl.cainfo

    将其更改为:

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

    确保删除该行开头的分号。

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

答案 1 :(得分:6)

这很难解决,但这是使用laravel的人的确切答案并且有这个问题。

我的确切应用程序版本是......

  

Laravel:5.4

     

Guzzlehttp:6.2

     

Laravel Socialite:3.0

从以下链接下载此卷曲证书的新副本:https://gist.github.com/VersatilityWerks/5719158/download

将文件保存在此路径中,从laravel应用程序vendor/guzzlehttp/guzzle/src/cacert.pem

的基础开始 然后在同一目录中的

打开RequestOptions.php并向下滚动到名为CERT的常量并将其更改为此const CERT = 'cacert.pem';,这应该可以解决所有问题。

修改

正如人们指出你永远不应该编辑供应商文件夹,这只是我在业余时间建立的应用程序的快速修复。对于我公司或其他任何应用程序而言,它并不是什么重要的事情,使用此方法需要您自担风险!请查看下面的答案

答案 2 :(得分:4)

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

使用cURL:

将CURLOPT_SSL_VERIYPEER设为false

使用Guzzle:

将verify设置为false

示例$ client-> request('GET','https://somewebsite.com',['verify'=> false]);

答案 3 :(得分:1)

  • 一些用户建议的对\vendor\guzzlehttp\guzzle\src\Client.php文件进行更改的解决方案是最糟糕的建议,因为如果运行composer update命令,对供应商文件夹的手动更改将被覆盖。
  • Jeffrey建议的解决方案是一种肮脏的速记解决方案,但在生产应用中不建议使用。
  • 如果您可以访问Web服务器上的php.ini文件,则kjdion84建议的解决方案是完美的。如果您使用共享主机,则可能无法编辑php.ini文件。

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

  1. 下载此文件:http://curl.haxx.se/ca/cacert.pem
  2. 将此文件放置在Laravel项目的根文件夹中。
  3. 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);

答案 4 :(得分:0)

另一个人最近问了同样的问题,看来我的回答是他的解决方案。 这是我提到的帖子:URL Post

这就是我所说的:

  

我会说实话,我对Laravel一无所知。但我有   与Symfony一样,许多其他问题也是如此。所以当你尝试的时候   很多事情没有成功。

     

最后,这个解决方案对我有用:URL solution

     

它表示可能会出现而不是证书问题   来自环境不兼容。我用XAMPP而不是   WAMP和它有效。

答案 5 :(得分:0)

我在运行Valet并尝试从valet的一个站点到另一个站点制作api时遇到此问题。 请注意,我正在OSX中工作。 我在这里找到了解决方案:https://github.com/laravel/valet/issues/460 简而言之,您必须将代客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

答案 6 :(得分:0)

我正在从域 X Y 发送请求,我的问题是域Y上使用的证书(不是自签名证书) ),该域属于我,并且我拥有证书,因此快速解决方案是在域X的应用程序上使用域Y的证书:

在域 X 上:

  • 使用Laravel 7 HTTP包装器:

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

  • 使用枪口:

    new GuzzleHttp\Client(['verify' => 'path-to-domain-Y-certificate']);

或者您可以直接与SSL提供商联系以解决该问题。

注意:将域的证书存储在另一个系统中不是安全的方法,只有在可以确保证书安全的情况下,才使用此方法。

我还没有发现证书出了什么问题,没有浏览器似乎对此有问题,唯一的问题是使用curl在laravel上生成的。

答案 7 :(得分:0)

通过在调试设置时完全禁用 verify 解决了我的问题,因为在这种本地场景中,安全根本不是问题。

$http = new \GuzzleHttp\Client([
            'base_uri' => config('services.passport.login_endpoint'),
            'verify' => config('app.debug') ? false : true,
            'defaults' => [
                'exceptions' => false,
            ]
        ]);

答案 8 :(得分:0)

我们可以根据 Medium.com 上的这篇文章设置路径How to fix cURL error 60: SSL certificate problem

要遵循的步骤:

  1. 打开http://curl.haxx.se/ca/cacert.pem
  2. 复制整个页面并将其另存为“cacert.pem”
  3. 打开您的 php.ini 文件并插入或更新以下行。 curl.cainfo = " [pathtofile]cacert.pem"

答案 9 :(得分:0)

您需要在vendor/guzzlehttp/guzzle/src/Client.php

中编辑以下文件
$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => false, //  By default this value will be true
    'cookies'         => false
];

可能存在安全问题,但它会起作用。

答案 10 :(得分:0)

您可以使用GuzzleHttp\Client

$client = new Client(['verify' => false]);

答案 11 :(得分:-2)

对于Laravel:以下5个步骤将有所帮助

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

    protected function getDefaultOptions(){     $ settings = [     'allow_redirects'=>真正,     'exceptions'=>真正,     'decode_content'=>真正,     'verify'=> getcwd()。'/ vendor / guzzlehttp / guzzle / src / cacert.pem'     ]。 }

  • http://curl.haxx.se/ca/cacert.pem下载最新文件cacert.pem并置于/vendor/guzzlehttp/guzzle/src/