[英]cURL error 60: SSL certificate in Laravel 5.4
完全錯誤
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)
設想
在有人向我指出這兩個 laracast 答案之前: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate
我已經看過它們了,這就是我在這里的原因。
我遇到的問題是,現在我有了 cacert.pem 文件,但放在哪里沒有意義,答案表明將文件放在我的 xampp 目錄中並更改我的php.ini
文件但我沒有使用xampp 對於任何事情,我使用 Laravel 的工匠服務器來運行我的項目。
如果 xampp 沒有被使用,我應該把這個文件放在哪里? 此外,為什么一個公認的答案是將它放在我的 xampp 目錄中? 我不明白。
我的確切問題
在 laravel 5.4 中,我應該在哪里放置cacert.pem
文件以阻止此錯誤?
不要修改vendor/
文件夾中的文件。 永遠。 它們可以並且將在您運行的下一個作曲家更新中被覆蓋。
這是我的WampServer解決方案
我使用PHP 7.1.9作為我的WampServer,因此在下面的示例中將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,你就好了!
這很難解決,但這里是使用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';
這應該解決所有問題。
編輯
正如人們指出你永遠不應該編輯供應商文件夾,這只是我在業余時間建立的應用程序的快速修復。 對於我公司或其他任何應用來說,這不是什么重要的事情,使用這種方法需要您自擔風險! 如果你需要更具體的東西,請查看其他答案。
快速解決方案,但不安全(不推薦)。
使用cURL:
將CURLOPT_SSL_VERIYPEER設置為false
使用Guzzle:
將verify設置為false
示例$ client-> request('GET',' https://somewebsite.com ',['verify'=> false]);
\\vendor\\guzzlehttp\\guzzle\\src\\Client.php
文件進行更改的解決方案是最糟糕的建議,因為如果運行composer update
命令,將覆蓋對vendor文件夾的手動更改。 php.ini
文件, kjdion84建議的解決方案是完美的。 如果您使用共享主機,可能無法編輯php.ini
文件。 當您無法訪問php.ini
文件時(例如,共享主機)
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 並嘗試從一個站點到另一個站點制作 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
我從域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 上生成的。
我們可以根據 Medium.com 上的這篇文章設置路徑How to fix cURL error 60: SSL certificate problem
要遵循的步驟:
您可以使用GuzzleHttp\\Client
:
$client = new Client(['verify' => false]);
通過在調試設置時完全禁用verify
解決它,因為在這個本地場景中,安全根本不是問題。
$http = new \GuzzleHttp\Client([
'base_uri' => config('services.passport.login_endpoint'),
'verify' => config('app.debug') ? false : true,
'defaults' => [
'exceptions' => false,
]
]);
您需要在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
];
可能存在安全問題,但它會起作用。
curl.cainfo = "C:\wamp64\bin\php\php7.1.9\cacert.pem"
我已經用 wamp 解決了我的問題。
這發生在我使用 laravel 8 開發時,使用默認服務器啟動:
php artisan serve
我的解決方案類似於其他要求您下載cacert.pem
並編輯php.ini
文件的答案。 但是由於我沒有使用 Wamp,我檢查了環境變量中的path
以查找默認的 php 安裝窗口並在那里進行更改。
我使用 laragon 服務器,我遇到了同樣的問題。 我從http://curl.haxx.se/ca/cacert.pem下載了 ssl 證書,並將其粘貼到 C:/laragon/ 重新啟動服務器,一切都很好
對於Laravel:以下5個步驟將有所幫助
Guzzlehttp: 5.2
\\vendor\\guzzlehttp\\guzzle\\src\\Client.php
下找到該文件 編輯默認設置
protected function getDefaultOptions(){$ settings = ['allow_redirects'=> true,'exceptions'=> true,'decode_content'=> true,'verify'=> getcwd()。'/ vendor / guzzlehttp / guzzle / src / cacert.pem']; }
從http://curl.haxx.se/ca/cacert.pem
下載最新文件cacert.pem並放在/vendor/guzzlehttp/guzzle/src/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.