CURL error 60: SSL-сертификат: не удалось получить сертификат локального эмитента

Я использую WAMP в локальной среде разработки и пытаюсь зарядить кредитную карту, но получаю сообщение об ошибке:

ошибка cURL 60: проблема сертификата SSL: не удалось получить сертификат локального эмитента

Я много искал в Google, и многие люди предлагают загрузить этот файл: cacert.pem, поместить его где-нибудь и ссылаться на него в моем php.ini. Это часть моего php.ini:

curl.cainfo = "C:\Windows\cacert.pem"

Тем не менее, даже после перезагрузки моего сервера несколько раз и изменения пути, я получаю то же сообщение об ошибке.

Я использую WAMP из модулей Apache и поддерживаю ssl_module. И из расширений PGP у меня включен php_curl.

Все те же сообщения об ошибках. Почему это происходит?

Теперь я следую этому исправлению: Как исправить ошибку PHP CURL 60 SSL

Что означает, что я добавляю эти строки в мои параметры cURL:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

Где я могу добавить параметры в мой cURL? По-видимому, не через командную строку, так как мой CLI не находит команду "curl_setopt"

ИЗМЕНИТЬ

Это код, который я запускаю:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}

Ответ 1

Рабочее решение

:

  • Предполагаем в окнах

Сервер XAMPP

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

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

  • поставьте его здесь

C:\XAMPP\PHP\Extras\SSL\cacert.pem

  • в php.ini помещает эту строку в этот раздел ( "c:\xampp\php\php.ini" ):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  • перезапустите веб-сервер/apache

Проблема решена!

(источник: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate)

Ответ 2

Если вы используете PHP 5.6 с помощью Guzzle, Guzzle переключился на использование автоопределения библиотек PHP для сертификатов, а не процесса (ref). В PHP описываются изменения здесь.

Узнайте, где PHP/Guzzle ищет сертификаты

Вы можете сбрасывать, где PHP ищет:

 var_dump(openssl_get_cert_locations());

Получение пакета сертификатов

Для тестирования OS X вы можете использовать homebrew для установки openssl brew install openssl а затем использовать openssl.cafile=/usr/local/etc/openssl/cert.pem в настройках php.ini или Zend Server (в OpenSSL).

Пакет сертификатов также доступен из curl/Mozilla на веб-сайте curl: https://curl.haxx.se/docs/caextract.html

Сообщение PHP Где сертификаты

После того, как у вас есть пакет, поместите его там, где PHP уже ищет (что вы узнали выше), или обновите openssl.cafile в php.ini. (Как правило, /etc/php.ini или /etc/php/7.0/cli/php.ini или /etc/php/php.ini в Unix.)

Ответ 3

Внимание Wamp/Wordpress/пользователей Windows. У меня была эта проблема часами, и даже правильный ответ не делал это для меня, потому что я редактировал неправильный файл php.ini, потому что на вопрос был дан ответ XAMPP, а не пользователям WAMP, хотя вопрос был для WAMP.

вот что я сделал

Загрузите комплект сертификатов.

Поместите его внутри C:\wamp64\bin\php\your php version\extras\ssl

Убедитесь, что файл mod_ssl.so находится внутри C:\wamp64\bin\apache\apache(version)\modules

Включить mod_ssl в httpd.conf внутри каталога Apache C:\wamp64\bin\apache\apache2.4.27\conf

Включите php_openssl.dll в php.ini. Помните, что проблема заключалась в том, что у меня было два файла php.ini, и мне нужно сделать это в обоих случаях. Первая из них может быть расположена внутри вашего значка панели задач WAMP.

enter image description here

а другой находится в C:\wamp64\bin\php\php(Version)

найдите местоположение для обоих файлов php.ini и найдите строку curl.cainfo = и дайте ей путь, подобный этому

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

Теперь сохраните файлы и перезагрузите сервер, и вам должно быть хорошо идти

Ответ 4

Guzzle, который используется cartalyst/stripe, сделает следующее, чтобы найти правильный архив сертификатов для проверки сертификата сервера:

  • Проверьте, установлен ли openssl.cafile в файле php.ini.
  • Проверьте, установлен ли curl.cainfo в файле php.ini.
  • Проверьте, существует ли /etc/pki/tls/certs/ca-bundle.crt (Red Hat, CentOS, Fedora; предоставляется пакетом ca-сертификатов)
  • Проверьте, существует ли /etc/ssl/certs/ca-certificates.crt (Ubuntu, Debian, предоставленный пакетом ca-сертификатов)
  • Проверьте, существует ли /usr/local/share/certs/ca-root-nss.crt (FreeBSD; предоставляется пакетом ca_root_nss)
  • Проверьте, если /usr/local/etc/openssl/cert.pem (OS X; предоставлено homebrew)
  • Проверьте, существует ли C:\windows\system32\curl-ca-bundle.crt (Windows)
  • Проверьте, существует ли C:\windows\curl-ca-bundle.crt (Windows)

Вы должны убедиться, что значения для первых двух параметров правильно определены, выполнив простой тест:

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

В качестве альтернативы попробуйте записать файл в места, обозначенные # 7 или # 8.

Ответ 5

Если вы не можете изменить php.ini, вы также можете указать файл cacert.pem из этого кода:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);

Ответ 6

Я нашел решение, которое сработало для меня. Я отказался от последнего жука до версии ~ 4.0, и он сработал.

В composer.json добавьте "guzzlehttp/guzzle": "~ 4.0"

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

Ответ 7

Я использовал var_dump(openssl_get_cert_locations()); die; var_dump(openssl_get_cert_locations()); die; в любом скрипте php, который дал мне информацию о умолчаниях, которые использовал мой локальный php:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

Как вы можете заметить, я установил ini_cafile или опцию ini curl.cainfo. Но в моем случае curl попытается использовать "default_cert_file", которого не было.

Я скопировал файл с https://curl.haxx.se/ca/cacert.pem в папку "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem), и я смог его получить работать.

Это было единственное решение для меня.

Ответ 8

У меня возникла проблема, когда эта проблема возникла из-за синего, когда Guzzle (5) script пытался подключиться к узлу через SSL. Конечно, я могу отключить опцию VERIFY в Guzzle/Curl, но это явно не правильный путь.

Я попробовал все перечисленное здесь и в похожих потоках, а затем отправился на терминал с помощью openssl, чтобы протестировать домен, с которым я пытался подключиться:

openssl s_client -connect example.com:443 

... и получил первые несколько строк, обозначающих:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

... в то время как все работает нормально, когда вы пытаетесь использовать другие адресаты (например: google.com и т.д.)

Это побудило меня связаться с доменом, к которому я пытался подключиться, и действительно, у них была проблема с ИХ КОНЕЦ, которая подкралась. Это было решено, и мой script вернулся к работе.

Итак... если вы вытаскиваете свои волосы, дайте opensl выстрел и посмотрите, есть ли что-нибудь с ответом от местоположения, которое вы пытаетесь подключить. Может быть, проблема не так "локальна" иногда.

Ответ 9

Я просто испытал эту же проблему с фреймворком Laravel 4 php, который использует guzzlehttp/guzzle. По какой-то причине сертификат SSL для mailgun неожиданно прекратил проверку, и я получил то же сообщение "ошибка 60".

Если, как и я, вы находитесь на общем хостинге без доступа к php.ini, другие решения невозможны. В любом случае у Guzzle есть этот код инициализации клиента, который, скорее всего, сменит эффекты php.ini:

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

Здесь Guzzle принудительно использует собственный внутренний файл cacert.pem, который, вероятно, теперь устарел, вместо того, чтобы использовать тот, который предоставляется средой cURL. Изменение этой строки (по крайней мере, на Linux) настраивает Guzzle для использования логики проверки SSL по умолчанию cURL и устраняет мою проблему:

        'verify'          => true

Вы также можете установить для этого значение значение false если вы не заботитесь о безопасности своего SSL-соединения, но это не очень хорошее решение.

Поскольку файлы в vendor не предназначены для подделки, лучшим решением было бы настроить клиент Guzzle на использование, но это было слишком сложно сделать в Laravel 4.

Надеюсь, это поможет кому-то еще пару часов отладки...

Ответ 10

Это может быть краевой случай, но в моем случае проблема была не в conf conf клиента (у меня уже был curl.cainfo настроенный в php.ini), но удаленный сервер не настроен должным образом:

Он не посылал никаких промежуточных сертификатов в цепочке. Не было ошибок при просмотре сайта с помощью Chrome, но с PHP я получил следующую ошибку.

ошибка cURL 60

После включения промежуточных сертификатов в конфигурации удаленного веб-сервера это сработало.

Вы можете использовать этот сайт для проверки конфигурации SSL вашего сервера:

https://whatsmychaincert.com/

Ответ 11

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

У меня был PHP версии 5.5, и мне нужно было обновиться до 5.6.

В версиях <5.6 Guzzle будет использовать собственный файл cacert.pem, но в более высоких версиях PHP он будет использовать файл system cacert.pem.

Я также загрузил файл здесь https://curl.haxx.se/docs/caextract.html и установил его в php.ini.

Ответ найден в файле Guzzles StreamHandler.php https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

Ответ 12

Вы пробовали..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

Если вы используете надежный источник, возможно, вам не нужно проверять сертификат SSL.

Ответ 13

Убедитесь, что вы открываете файл php.ini непосредственно с помощью Window Explorer. (в моем случае: C:\DevPrograms\wamp64\bin\php\php5.6.25).

Не используйте ярлык для php.ini в меню значков Wamp/Xamp в системном трее. Этот ярлык не работает в этом случае.

Затем отредактируйте это php.ini:

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

и

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

После сохранения php.ini вам не нужно "перезапускать все службы" в значке Wamp или закрыть/повторно открыть CMD.

Ответ 14

когда я запускаю 'var_dump(php_ini_loaded_file());' Я получаю этот вывод на своей странице 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

и чтобы получить php для загрузки моего файла cert, мне пришлось отредактировать php.ini в этом пути 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' и добавить openssl.cafile="C: /Development/bin/php/php7.2.4/extras/ssl/cacert.pem" где я загрузил и разместил свой файл сертификата с https://curl.haxx.se/docs/caextract.html

am на окнах 10, используя drupal 8, wamp и php7.2.4

Ответ 15

Как вы используете Windows, я думаю, что ваш разделитель путей - '\' (и '/' в Linux). Попробуйте использовать константу DIRECTORY_SEPARATOR. Ваш код будет более переносимым.

Try:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

EDIT: и напишите полный путь. У меня были некоторые проблемы с относительными путями (возможно, завиток выполняется из другого базового каталога?)

Ответ 16

если вы используете WAMP, вы также должны добавить строку сертификата в php.ini для Apache (помимо файла php.ini по умолчанию):

[curl]
curl.cainfo = C:\your_location\cacert.pem

работает для php5.3 +