Я использую 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 здесь (чистый формат / данные файла)
C: \ XAMPP \ PHP \ Extras \ SSL \ cacert.pem
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
Задача решена!
Если вы используете PHP 5.6 с помощью Guzzle, Guzzle переключился на использование автоопределения библиотек PHP для сертификатов, а не для своего процесса ( ref ). В PHP описываются изменения здесь .
Вы можете сбрасывать, где 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 уже ищет (что вы узнали выше), или обновите openssl.cafile
в php.ini. (Как правило, /etc/php.ini
или /etc/php/7.0/cli/php.ini
или /etc/php/php.ini
в Unix.)
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, предоставленный доморощенным) 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.
Если вы не можете изменить 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: и напишите полный путь. У меня были некоторые проблемы с относительными путями (возможно, завиток выполняется из другого базового каталога?)