cURL error 60: SSL-сертификат prblm: невозможно получить сертификат локального эмитента

Я хочу собрать список видео, загруженных по определенному каналу, используя API данных YouTube. Однако перед реализацией онлайн я пытаюсь запустить мой код в автономной среде (WAMPserver, PHP 5.5.12, Apache 2.4.9). Я использую следующий код:

require_once 'google-api-php-client-2.0.0-RC5/vendor/autoload.php';

$client = new Google_Client();
$client->setApplicationName("SRC_Thor");
$client->setDeveloperKey("xxxxxxxxxxx");

$youtube = new Google_Service_YouTube($client);

$channelResponse = $youtube->channels->listChannels('contentDetails', []);
var_dump($channelResponse);

Однако это приводит к следующей ошибке:

Неустранимая ошибка: исключение исключения "GuzzleHttp\Exception\RequestException" с сообщением "ошибка cURL 60: проблема с сертификатом SSL: не удается получить сертификат локального эмитента" (см. http://curl.haxx.se/libcurl/c/libcurl-errors.html)"

Я попытался добавить последнюю версию cacert.pem поскольку большинство тем на SO предлагают в качестве решения, однако безрезультатно.

Ответ 1

Если вы работаете в Windows и используете Xampp, я украду лучший ответ из здесь, было бы полезно, если бы Google сначала показал вам этот вопрос.

  1. Загрузите и извлеките файл cacert.pem здесь (чистый формат файла/данные)

    https://curl.haxx.se/docs/caextract.html

  2. Поместите это в:

    C:\xampp\php\extras\ssl\cacert.pem

  3. Добавьте эту строку в ваш php.ini

    curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"

  4. перезагрузите ваш веб-сервер/Apache

Ответ 2

Видя, что я использую локальную среду, я могу безопасно отключить SSL, который я использовал, используя следующее:

$guzzleClient = new \GuzzleHttp\Client(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
$client->setHttpClient($guzzleClient);

Где $client - мой Google_Client().

Ответ 4

Я работаю с xamps. Ничто из вышеперечисленного не помогло мне

Я попробовал это, и это сработало

  1. открыть vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

и измени это

$conf[CURLOPT_SSL_VERIFYHOST] = 2;
$conf[CURLOPT_SSL_VERIFYPEER] = true;

к этому

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

это временное решение, если вы обновили этот файл, изменения будут потеряны

Ответ 5

PCI-DSS 3.1 требует, чтобы все SSL только TLS 1.2, поэтому многие провайдеры просто поворачивают все, кроме TLS 1.2. Я столкнулся с этим типом проблемы, когда CURL видел отказ от отмены рукопожатий как неспособность проверить сертификат SSL. Попробуйте найти, где ваш код выполняет вызов CURL, и добавьте эту строку (обязательно замените $ch на все, что CURL обрабатывает ваш код)

curl_setopt($ch, CURLOPT_SSLVERSION, 6);  // Force TLS 1.2

Ответ 6

$guzzleClient = new \GuzzleHttp\Client(['verify' => false]);

Ответ 7

для сущности разработки и тестирования, у вас есть два варианта быстрого решения

  1. использование
$client = new GuzzleHttp\Client();
$request = $client->request('GET',$url, ['verify' => false]); //where $url is your http address
  1. следуйте @Pham Huy Anh ответ выше, тогда сделайте это
$client = new GuzzleHttp\Client();
$request = $client->request('GET',$url, ['verify' => 'C:\xampp\php\extras\ssl\cacert.pem']);

Надеюсь, это поможет кому-то.

Ответ 8

он также работал для меня, загрузив сертификат по ссылке https://gist.github.com/VersatilityWerks/5719158/download, затем сохраните его в C:\xampp\php\extras\ssl, затем отредактируйте php.ini. Чтобы получить Php.ini быстро, см. Рисунок ниже, введите описание изображения здесь

Затем STOP и снова запустите свой apache. он работал хорошо !!!