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

Yas*_*nch 16 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中停止此错误?

kjd*_*n84 77

不要修改文件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并找到这一行:

;curl.cainfo

将其更改为:

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

确保在行的开头删除分号.

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

  • 它有效,而且我也认为,这非常重要:不要触摸 ```vendor/``` 文件夹。 (3认同)
  • 请注意,Wamp 环境中有多个版本的 `php.ini`。此解决方案可能会导致使用存储在当前 php 版本目录中的版本。实际上,它可能不是 Wamp 加载的那个。使用 Wamp Menu > PHP > php.ini 听起来更好。这可能会导致实际加载的 Apache 目录中的版本。 (3认同)
  • 这奏效了。你能简要解释/描述这里发生了什么吗?谢谢你。 (2认同)

小智 18

您可以使用GuzzleHttp\Client

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


Yas*_*nch 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';,这应该解决所有问题.

编辑

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


Jef*_*rey 6

快速解决方案但不安全(不建议)。

使用cURL:

将CURLOPT_SSL_VERIYPEER设置为false

使用Guzzle:

设置验证为假

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

  • 谢谢,这对我有用 laravel 7+ ```$res = \Http::withOptions(['verify' => false])->get("http://somewebsite.com"); ```` (3认同)

Ham*_*hid 6

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

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

  1. 下载此文件:http : //curl.haxx.se/ca/cacert.pemhttps://curl.se/docs/caextract.html
  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);
Run Code Online (Sandbox Code Playgroud)