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


232

Я использую 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');
}

Предполагая, что с вашим кодом нет проблем, это может быть ваш брандмауэр. Попробуйте отключить брандмауэр для проверки.
Вакар уль Ислам

Разве я не дал вам ответ на этот вопрос здесь ? :)
Лимон Монте

@limonte возможно, пришлось переключать проекты и, вероятно, такая же проблема с новым проектом. Вернемся к проблеме с жадностью и, возможно, это то же самое решение. brb
LoveAndHappiness

1
Вы пробовали последнюю версию нашивки? Я вижу сообщение о коммите, которое изменило что-то, связанное с сертификатами ... github.com/stripe/stripe-php/commit/…
thelastshadow

1
@ LoveAndHappiness есть ли у вас решение этой проблемы? Я сталкиваюсь с той же ошибкой с полосой. Пожалуйста, дайте мне знать, если у вас есть решение.
Дев

Ответы:


516

Рабочее решение, предполагающее использование Windows в XAMPP:

XAMPP сервер

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

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

  1. Поместите это здесь в следующем каталоге.

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

  1. В вашем php.ini поместите эту строку в этот раздел («c: \ xampp \ php \ php.ini»):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

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

  2. Задача решена!

(Ссылка: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )


6
Это сообщение приходит из-за вашей версии PHP. Если он выше, чем в PHP 5.5, то появляется эта ошибка из-за новой функции PHP 5.6. PHP 5.6 проверяет сертификаты, если вы используете cURL.
UWU_SANDUN

9
Спасибо за ответ! Хотя я бы порекомендовал использовать cacert.pem с официальной страницы curl: curl.haxx.se/docs/caextract.html
dieBeiden

6
Просто хотел указать на тех, кто не может заставить это работать - я использовал косую черту, curl.cainfo = "C:/cacert.pem"а также должен был перезагрузить компьютер, чтобы заставить его работать. Просто перезапустить веб-сервер было недостаточно. Надеюсь, это поможет:]
space_food_

1
и не забудьте раскомментировать curl.cainfo(
лицевая сторона лица

Работал как шарм! Спасибо
Джек,

57

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

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


Меньше вам нужно сделать оба php.ini, чем тот, который вы собираетесь использовать: если вы используете apache в качестве клиента SAPI, то измените один в каталоге apache и / или измените тот в клиенте dir, если вы планируете использовать php.exe в качестве SAPI.
Фабьен Хаддади

3
«Мне нужно сделать это в обоих» - ключевая нота. Спасибо
Ярослав Климчик

1
Это работает для Laravel 5.5 с "guzzlehttp / guzzle": "^ 6.3". Wamp сервер 3.1.3. Php 7.1 *
Дипеш Тхапа

это сработало. Спасибо
user4906240

Спасибо за ответ на
Wamp

46

Если вы используете PHP 5.6 с Guzzle, Guzzle переключился на использование автоматического определения библиотек PHP для сертификатов, а не для их обработки ( ссылка ). 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
ДА. Увидев, что слишком много людей предлагают явно неправильный подход к понижению на несколько номеров версий, это становится правильным подходом imho. Я следовал советам других по поводу кафе, но у меня не было средств проверить, почему оно до сих пор не загружается. Эта функция openssl_get_cert_locations () действительно выполнила работу по выявлению моей проблемы. Спасибо!
Сеть и поток

1
Спасибо за предоставление openssl_get_cert_locations, это сделало отладку намного легче. Похоже, что WAMP использует другой INI-файл для Apache PHP, чем для консоли PHP. В моем случае мне пришлось добавить openssl.cafile="c:/_/cacert.pem"консольный php. В прошлый раз, когда я использовал его через apache, мне нужно curl.cainfo="c:/_/cacert.pem"было заставить его работать.
psycho brm

16

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.


13

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

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

8

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

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


У меня похожая проблема, и мое местоположение что-то вроде c: /usr/local/ssl/cert.pem, но это местоположение не существует, вы знаете, что это может быть, в дальнейшем этот же проект используется моим coluge на компьютере Mac может поэтому я пробовал все остальное, то есть добавление сертификата в файл .ini, но он не работает, похоже, ваше решение должно работать, поскольку оно имеет смысл, но не может изменить это местоположение и не может поставить сертификат в месте, которое не существует.
AbdulMueed

Вы можете попробовать создать папки и поставить сертификат по указанному пути?
Георгий Донев

7

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


6

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

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

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


Это также помешает вам использовать любые функции версии 5/6. Вместо этого просто установите для параметра false значение в массиве параметров (3-й параметр метода запроса): $ client-> request ('GET', '/', ['verify' => false]);
S ..

3

Убедитесь, что вы открываете 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.


2

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

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

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


2

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

У меня была версия 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.

2

Все ответы верны; но самое главное, вы должны найти правильный файл 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 или на любом используемом вами сервере, менять их по одному и проверять. *


1

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

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


1

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

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

ошибка cURL 60

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

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

https://whatsmychaincert.com/


1

когда я бегу, '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

У меня есть правильное решение этой проблемы, давайте попробуем понять причину этой проблемы. Эта проблема возникает, когда ssl удаленных серверов не может быть проверен с использованием корневых сертификатов в хранилище сертификатов вашей системы или удаленный ssl не установлен вместе с цепочечными сертификатами. Если у вас есть система Linux с доступом root ssh, то в этом случае вы можете попробовать обновить хранилище сертификатов с помощью следующей команды:

update-ca-certificates

Если все еще, это не работает, тогда вам нужно добавить корневой и промежуточный сертификат удаленного сервера в вашем хранилище сертификатов. Вы можете скачать корневые и промежуточные сертификаты и добавить их в / usr / local / share / ca-сертификаты а затем запустить команду update-ca-certificates. Это должно сделать свое дело. Аналогично для окон вы можете искать, как добавить root и промежуточный сертификат.

Другой способ решить эту проблему - попросить команду удаленного сервера добавить ssl-сертификат в виде набора корневого сертификата домена, промежуточного сертификата и корневого сертификата.


-1

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

Пытаться:

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

РЕДАКТИРОВАТЬ: и напишите полный путь. У меня были некоторые проблемы с относительными путями (возможно, curl выполняется из другого базового каталога?)


1
Это не будет иметь значения, потому что фактические настройки cURL находятся вне вашего контроля, когда вы используете эту конкретную библиотеку Stripe.
Яцк

-1

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

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

работает на php5.3 +


Да! Будьте внимательны при редактировании файлов php.ini и apache, и php. Для пользователей WAMP этот ответ был единственным, чтобы решить мою проблему: stackoverflow.com/questions/28858351/…
MavBzh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.