it-swarm.com.ru

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

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

ошибка 60 cURL: проблема с сертификатом 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');
}
164
LoveAndHappiness

рабочий раствор:

  • При условии на окнах 

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 )

419
Dung

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

35
Loren

Вниманию пользователей 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"

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

21
Rami Nour

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-Certificates)
  4. Проверьте, существует ли /etc/ssl/certs/ca-certificates.crt (Ubuntu, Debian; предоставляется пакетом ca-Certificates)
  5. Проверьте, существует ли /usr/local/share/certs/ca-root-nss.crt (FreeBSD; предоставляется пакетом ca_root_nss)
  6. Проверьте, если /usr/local/etc/openssl/cert.pem (OS X; предоставляется homebrew)
  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.

11
Ja͢ck

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

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

Я использовал 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 option curl.cainfo. Но в моем случае curl попытается использовать «default_cert_file», который не существует. 

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

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

6
George Donev

Я нашел решение, которое сработало для меня. Я понизил версию с последней версии до 4.0, и это сработало.

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

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

5
Iruku Kagika

Однажды я столкнулся с этой проблемой, когда скрипт 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 и т. д.)

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

Так что ... если вы вытаскиваете свои волосы, сделайте openssl попытку и посмотрите, есть ли что-нибудь в ответе от местоположения, которое вы пытаетесь подключить. Может быть, проблема не так уж и локальна в конце концов.

5
Daydream Nation

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

1
Quang Nguyen Tri

Я только что столкнулся с этой же проблемой в PHP-фреймворке Laravel 4, который использует пакет компоновщика guzzlehttp/guzzle. По какой-то причине сертификат SSL для почтового пистолета внезапно прекратил проверку, и я получил то же самое сообщение об ошибке 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 on, но это было слишком сложно сделать в Laravel 4.

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

1
bernie

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

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

ошибка cURL 60

После включения Intermediate Certs в конфигурацию удаленного веб-сервера все заработало.

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

https://whatsmychaincert.com/

1
Tobias K.

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

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

В версиях <5.6 Guzzle будет использовать свой собственный файл cacert.pem, но в более высоких версиях PHP он будет использовать системный файл 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.
1
Marko Milivojevic

Все ответы верны; но самое главное Вы должны найти правильный файл php.ini. проверьте эту команду в cmd "php --ini" не правильный ответ для нахождения правильного файла php.ini.

если вы редактируете

curl.cainfo ="PATH/cacert.pem"

и проверить

var_dump(openssl_get_cert_locations()); 

тогда curl.cainfo должен иметь значение. если нет, то это не тот файл php.ini;

* Я рекомендую вам поискать * .ini в wamp/bin или xxamp/bin или на любом используемом вами сервере, менять их один за другим и проверять. *

0
Mohsen Molaei

Ты пытался..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

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

0
Mike Miller

когда я запускаю '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.html

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

0
Nicholas