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