ошибка 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 145

16 ответов:

рабочего раствора:

  • предполагая, что на windows

сервер XAMPP

аналогично для другой среды - скачать и извлечь для cacert.pem здесь (чистый формат файла / данных)

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

  • поставьте здесь

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

проблема решена!

(источник: 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-библиотек 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 внутри каталога 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"

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

жрать, который используется 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; предоставляется пакет сертификации-сертификаты)
  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.

Если вы не можете изменить 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 сервер:

https://whatsmychaincert.com/

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

У меня была 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.html

am на windows 10, используя drupal 8, wamp и php7.2. 4

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

попробуй:

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

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

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

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

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