ошибка cURL 60: сертификат SSL: не удается получить сертификат локального издателя
Я использую WAMP в локальной среде разработки и пытаюсь зарядить кредитную карту, но получаю сообщение об ошибке:
ошибка cURL 60: проблема с сертификатом SSL: не удается получить сертификат локального эмитента
Я много искал в Google, и многие люди предлагают мне загрузить этот файл:cacert.Пем, поместите его куда-нибудь и ссылайтесь на него в моем php.Ини. Это часть моего php.ini:
curl.cainfo = "C:Windowscacert.pem"
тем не менее, даже после перезагрузив мой сервер несколько раз и изменив путь, я получаю то же сообщение об ошибке.
Я использую WAMP из модулей Apache и включаю ssl_module. И из расширений PGP у меня включен php_curl.
все равно то же сообщение об ошибке. Почему это происходит?
Теперь я следую этому исправлению:как исправить PHP CURL Error 60 SSL
что говорит о том, что я добавляю эти строки в мой локон опции:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
где я могу добавить параметры для моего завитка? По-видимому, не через командную строку, так как мой CLI не находит команду "curl_setopt"
EDIT
Это код, который я запускаю:
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');
}
16 ответов:
рабочего раствора:
- предполагая, что на windows
сервер XAMPP
аналогично для другой среды - скачать и извлечь для cacert.pem здесь (чистый формат файла / данных)
- поставьте здесь
C:\xampp\php\extras\ssl\cacert.Пем
- in ваш php.ini поместите эту строку в этот раздел ("c:\xampp\php\php.ini"):
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
- перезагрузите веб-сервер / apache
проблема решена!
если вы используете PHP 5.6 с Guzzle, Guzzle переключился на использование PHP-библиотек autodetect для сертификатов, а не на процесс ( 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 (в разделе OpenSSL).пакет сертификатов также доступен из curl / Mozilla на веб-сайте curl:https://curl.haxx.se/docs/caextract.html
сообщая PHP, где находятся сертификаты
как только у вас есть пакет, либо поместите его туда, где PHP уже ищет (что вы узнали выше), либо обновите
openssl.cafile
в php.Ини. (В общем,/etc/php.ini
или/etc/php/7.0/cli/php.ini
или/etc/php/php.ini
on Юникс.)
внимание пользователей 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
внутри каталога ApacheC:\wamp64\bin\apache\apache2.4.27\conf
включить
php_openssl.dll
наphp.ini
. Имейте в виду, что моя проблема заключалась в том, что у меня было два php.ini-файлы и мне нужно сделать это в обоих из них. Первый может быть расположен внутри вашего значка панели задач WAMP здесь.а другой находится в
C:\wamp64\bin\php\php(Version)
найти место для обоих
php.ini
файлы и найдите строкуcurl.cainfo =
и дайте ему такой путь
curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
теперь сохраните файлы и перезагрузите сервер, и вы должны быть хорошо идти
жрать, который используется cartalyst / stripe, сделает следующее, чтобы найти правильный архив сертификатов для проверки сертификата сервера против:
- проверить, если
openssl.cafile
устанавливается в вашем php.ini-файл.- проверить, если
curl.cainfo
устанавливается в вашем php.ini-файл.- проверить, если
/etc/pki/tls/certs/ca-bundle.crt
существует (Red Hat, CentOS, Fedora; предоставляется пакетом ca-certificates)- проверить, если
/etc/ssl/certs/ca-certificates.crt
существует (Ubuntu, Debian; предоставляется пакет сертификации-сертификаты)- проверить, если
/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.
Если вы не можете изменить php.ini вы также можете указать на cacert.PEM-файл с кодом:
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']); $client = new Google_Client(); $client->setHttpClient($http);
Я нашел решение, которое работает для меня. Я понизил рейтинг с последней версии guzzle до версии ~4.0, и это сработало.
В композитора.json добавить "guzzlehttp / жрать": "~4.0"
надеюсь, что это поможет кому-то
то, что я сделал, было использование
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. Конечно, я мог бы отключить опцию проверки в 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, etc)
это побудило меня связаться с доменом, к которому я пытался подключиться, и действительно, у них была проблема на их конце, которая подкралась. Это было решено, и мой сценарий вернулся к работе.
Так... если вы вытаскиваете свои волосы, дайте openssl выстрел и посмотрите, есть ли что-нибудь с ответом от места, которое вы пытаетесь соединять. Может быть, проблема не так "локальна" в конце концов иногда.
Я только что испытал эту же проблему с Laravel 4 PHP framework, который использует
guzzlehttp/guzzle
пакета Composer. По какой-то причине 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' ];
здесь жрать заставляет использование собственного внутреннего cacert.файл pem, который, вероятно, теперь устарел, вместо того, чтобы использовать тот, который предоставлен окружение керла. Изменение этой строки (по крайней мере, в Linux) настраивает Guzzle для использования логики проверки SSL по умолчанию cURL и исправляет мою проблему:
'verify' => true
вы также можете установить это в
false
если вы не заботитесь о безопасности вашего SSL-соединения, но это не очень хорошо решение.так как файлы в
vendor
не предназначены для вмешательства, лучшим решением было бы настройка клиента жрать при использовании, но это было слишком сложно сделать в Laravel 4.надеюсь, что это сэкономит кому-то еще пару часов отладки...
Это может быть крайним случаем, но в моем случае проблема была не клиент conf (у меня уже был
curl.cainfo
настроить вphp.ini
), а удаленный сервер не настроен должным образом:он не посылал никаких промежуточных сертификаты в цепи. Там не было ошибки просмотра сайта с помощью Chrome, но с PHP я получил следующую ошибку.
ошибка скручивания 60
после в том числе Промежуточные Сертификаты в конфигурации удаленного веб-сервера он работал.
Вы можете использовать этот сайт для проверки конфигурации SSL сервер:
Я потратил слишком много времени, чтобы выяснить эту проблему для меня.
У меня была PHP версии 5.5 и мне нужно было обновить до 5.6.
в версиях
Я также скачал файл отсюда https://curl.haxx.se/docs/caextract.html и установить его в php.Ини.
ответ найден в жрет 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.
вы пробовали..
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.
когда я запускаю
'var_dump(php_ini_loaded_file());'
Я получаю этот вывод на моей странице'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'
и чтобы заставить php загрузить мой файл сертификата, мне пришлось отредактировать 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.htmlam на windows 10, используя drupal 8, wamp и php7.2. 4
Как вы используете Windows, я думаю, что ваш путь разделитель '\' (и '/' на Linux). Попробуйте использовать константу
DIRECTORY_SEPARATOR
. Ваш код будет более компактен.попробуй:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');
изменить: и написать полный путь. У меня были некоторые проблемы с относительными путями (возможно, завиток выполнен из другой директории?)