cURL ошибка 60: сертификат SSL в 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)
сценарий
Прежде чем кто-то укажет мне на эти два ответа 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 Artisan для запуска моего проекта. Если xampp не используется, то где я могу разместить этот файл и более того, почему принятым ответом будет поместить его в мой каталог xampp, я не понимаю
Мой точный вопрос
Где я могу разместить файл cacert.pem
чтобы остановить эту ошибку в laravel 5.4?
Ответы
Ответ 1
Никогда не изменяйте файлы в папке vendor/
папки. Когда-либо. Они могут быть перезаписаны и будут перезаписаны в следующем обновлении композитора.
Вот мое решение для WampServer
Я использую PHP 7.1.9 для своего WampServer, поэтому измените 7.1.9
в приведенном ниже примере на номер версии, который вы используете в настоящее время.
- Скачать этот файл: http://curl.haxx.se/ca/cacert.pem
- Поместите этот файл в папку
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, и вы готовы к работе!
Ответ 2
Это было сложно выяснить, но вот точный ответ для людей, использующих laravel, и у которых есть эта проблема.
Мои точные версии приложений...
Laravel: 5.4
Guzzlehttp: 6.2
Laravel Socialite: 3.0
Загрузите свежую копию этого сертификата curl по этой ссылке: https://gist.github.com/VersatilityWerks/5719158/download
Сохраните файл по этому пути, начиная с базового корня вашего приложения laravel vendor/guzzlehttp/guzzle/src/cacert.pem
затем в этом же каталоге откройте RequestOptions.php
и прокрутите вниз до константы с именем CERT
и измените ее на эту const CERT = 'cacert.pem';
, и это должно все исправить.
EDIT
Как говорят люди, вы никогда не должны редактировать папку вендора, это было просто быстрое решение для приложения, которое я создавал в свободное время. Это не было чем-то важным, как приложение для моей компании или что-то подобное, используйте этот метод на свой страх и риск! Пожалуйста, проверьте другие ответы, если вам нужно что-то более конкретное.
Ответ 3
Быстрое решение, но небезопасное (не рекомендуется).
Использование cURL:
Установите для CURLOPT_SSL_VERIYPEER значение false
Используя Guzzle:
Установить проверку на ложь
пример $client-> запроса ('GET', 'https://somewebsite.com', ['verify' => false]);
Ответ 4
- Решение, предложенное некоторыми пользователями для внесения изменений в файл
\vendor\guzzlehttp\guzzle\src\Client.php
является наихудшим советом, так как ручные изменения, внесенные в папку vendor, перезаписываются при запуске команды composer update
. - Решение, предложенное Джеффри, является грязным, сокращенным решением, но не рекомендуется в производственных приложениях.
- Решение, предложенное kjdion84, идеально, если у вас есть доступ к файлу
php.ini
на веб-сервере. Если вы используете Shared Hosting, редактирование файла php.ini
может оказаться невозможным.
Если у вас нет доступа к файлу php.ini
(например, Shared Hosting)
- Загрузите этот файл: http://curl.haxx.se/ca/cacert.pem
- Поместите этот файл в корневую папку вашего проекта 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);
Ответ 5
Другой недавно попросил ту же проблему, и, похоже, мой ответ был для него решением. Вот сообщение, которое я упоминаю: URL Post
Это то, что я сказал:
Я буду полностью честен, я ничего не знаю о Ларавеле. Но у меня была такая же проблема, как и многие другие, на Symfony. И так, как вы, я пробовал много вещей без успеха.
Наконец, это решение работало для меня: решение URL
Это указывает на то, что вместо проблемы с сертификатом это может быть связано с несовместимостью среды. Я использовал XAMPP вместо WAMP, и это сработало.
Ответ 6
У меня была эта проблема при запуске Valet и попытке сделать API-интерфейс с одного сайта в камердинере на другой.
Обратите внимание, что я работаю в OSX.
Я нашел решение здесь: https://github.com/laravel/valet/issues/460
Короче говоря, вы должны скопировать пакет камердинера в пакет 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
Ответ 7
для Laravel: 5 шагов ниже будут полезны
- обновить версию до
Guzzlehttp: 5.2
- найти файл под
\vendor\guzzlehttp\guzzle\src\Client.php
-
изменить настройки по умолчанию
защищенная функция getDefaultOptions() {$ settings = ['allow_redirects' => true, 'exceptions' => true, 'decode_content' => true, 'verify' => getcwd(). '/vendor/guzzlehttp/guzzle/src/cacert.pem ']; }
-
скачать последний файл cacert.pem с http://curl.haxx.se/ca/cacert.pem
и разместить под /vendor/guzzlehttp/guzzle/src/