簡體   English   中英

cURL 錯誤 60:Laravel 5.4 中的 SSL 證書

[英]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

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 目錄中? 我不明白。

我的確切問題

在 laravel 5.4 中,我應該在哪里放置cacert.pem文件以阻止此錯誤?

不要修改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,你就好了!

這很難解決,但這里是使用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文件夾的手動更改。
  • 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);

我在運行 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

我從域XY發送請求,我的問題是域 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

要遵循的步驟:

  1. 打開http://curl.haxx.se/ca/cacert.pem
  2. 復制整個頁面並將其保存為“cacert.pem”
  3. 打開您的 php.ini 文件並插入或更新以下行。 curl.cainfo = " [pathtofile]cacert.pem"

您可以使用GuzzleHttp\\Client

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

另一個人最近問了同樣的問題,看來我的答案是他的解決方案。 這是我提到的帖子: URL Post

這就是我所說的 :

我會說實話,我對Laravel一無所知。 但是,和Symfony一樣,我也遇到了同樣的問題。 因此,當我嘗試很多事情但沒有成功時。

最后,這個解決方案對我有用: URL解決方案

它表明,它可能來自環境不兼容 ,而不是證書問題 我使用XAMPP而不是WAMP,它起作用了。

通過在調試設置時完全禁用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM