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

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

  • Предполагая, что на окнах

Сервер 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 )

Если вы используете 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.)

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

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

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

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

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

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

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

Я использовал 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), и я смог его получить работать.

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

Я столкнулся с проблемой, которая возникла в один прекрасный день, когда скрипт Guzzle (5) пытался подключиться к узлу через 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 и т. д.),

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

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

Ты пробовал..

 curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false); 

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

Убедитесь, что вы открываете файл php.ini непосредственно вашим проводником окон. (в моем случае: 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.

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

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

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

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

Пытаться:

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

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