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 в приведенном ниже примере на номер версии, который вы используете в настоящее время.

  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, и вы готовы к работе!

Ответ 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)

  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);

Ответ 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/