помилка cURL 60: сертифікат SSL: неможливо отримати сертифікат локального емітента


232

Я використовую 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 Error 60 SSL

Що говорить про те, що я додаю ці рядки до моїх варіантів CURL:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

Де я можу додати параметри до свого CURL? Мабуть, не через командний рядок, оскільки мій 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');
}

Якщо припустити, що з вашим кодом проблем немає, це може бути ваш брандмауер. Спробуйте відключити брандмауер для тестування.
Waqar ul islam

did't Я дав вам відповідь на це питання тут ? :)
Лімон Монте

@limonte можливо, довелося перемикати проекти і, мабуть, однакова проблема з новим проектом. Повернемося до проблеми з головоломкою, і, можливо, це те саме виправлення. brb
LoveAndHappiness

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

1
@LoveAndHappiness Ви вирішили цю проблему? Я зіткнувся з тією ж помилкою з смугою. Будь ласка, дайте мені знати, чи є у вас рішення.
Dev

Відповіді:


515

Робоче рішення, припускаючи, що ваш 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. Перезавантажте веб-сервер / апаш

  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(facepalm)
Едмунд Сульзанок

Працював як шарм! Спасибі
Джек

55

Увага користувачів 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, то змініть його в апаш-dir та / або внесете зміни в клієнтський. dir, якщо ви плануєте використовувати php.exe як SAPI.
Фаб'єн Хаддаді

3
"Мені потрібно зробити це в обох", - це ключова примітка. Дякую
Ярослав Клімчик

1
Це працює для Laravel 5.5 з "guzzlehttp / guzzle": "^ 6.3". Сервер Wamp 3.1.3. Php 7,1 *
Діепеш Тапа

це спрацювало. Дякую
користувач4906240

Дякуємо, що відповіли за wamp
altoids

46

Якщо ви використовуєте PHP 5.6 з Guzzle, Guzzle перейшов на використання автоматичного виявлення бібліотек PHP для сертифікатів, а не процесу ( ref ). PHP окреслює зміни тут .

Дізнайтеся, де PHP / Guzzle шукає сертифікати

Ви можете демпінгувати там, де шукає PHP:

 var_dump(openssl_get_cert_locations());

Отримання пакету сертифікатів

Для тестування OS X ви можете використовувати домашню мову для встановлення 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
ТАК. Побачивши, що занадто багато людей припускають очевидно неправильний підхід щодо зменшення кількості версій на кілька номерів версій, це є правильним підходом. Я дотримувався порад інших щодо файлу, але не мав можливості перевірити, чому він все ще не завантажується. Ця функція 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-сертифікатів)
  4. Перевірте, чи /etc/ssl/certs/ca-certificates.crtіснує (Ubuntu, Debian; надається пакетом ca-сертифікатів)
  5. Перевірте, чи /usr/local/share/certs/ca-root-nss.crtіснує (FreeBSD; надається пакетом ca_root_nss)
  6. Перевірте, чи немає /usr/local/etc/openssl/cert.pem(ОС X; надається домашньою мовою)
  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 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-машині це є причиною, я спробував все інше, тобто додавання cert-місця у файл .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. Замість цього просто встановіть verify на false у масиві param (3-й параметр методу запиту): $ client-> request ('GET', '/', ['verify' => false]);
С ..

3

Будьте впевнені, що ви відкриєте php.iniфайл безпосередньо за допомогою Провідника Windows. (у моєму випадку 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

Я щойно відчув цю проблему з Laravel 4 php фреймворком, який використовує 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 на використання, але це було занадто складно зробити в Laravel 4.

Сподіваюсь, це заощадить когось ще пару годин налагодження ...


1

Це може бути кращим випадком, але в моєму випадку проблема полягала не в конфіденційності клієнта (я вже 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, щоб завантажити мій файл cert, мені довелося відредагувати 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"туди, де я завантажив і розмістив файл cert з https://curl.haxx.se/docs/caextract.html

Я на Windows 10, використовуючи drupal 8, wamp та php7.2.4


0

У мене є правильне рішення цієї проблеми, давайте спробуємо зрозуміти першопричину цієї проблеми. Ця проблема виникає, коли віддалені сервери ssl неможливо перевірити за допомогою кореневих сертифікатів у сховищі сертифікатів вашої системи або віддалений ssl не встановлений разом із ланцюговими сертифікатами. Якщо у вас є система Linux з кореневим доступом ssh, то в цьому випадку ви можете спробувати оновити сховище сертифікатів за допомогою команди нижче:

update-ca-certificates

Якщо все-таки це не працює, вам потрібно додати кореневий та проміжний сертифікат віддаленого сервера у вашому магазині cert. Ви можете завантажити кореневі та проміжні серти та додати їх у каталог / usr / local / share / ca-сертифікати та виконувати команду update-ca-certificates. Це повинно зробити трюк. Аналогічно для Windows ви можете шукати, як додати кореневу та проміжну cert.

Інший спосіб вирішити цю проблему - попросити команду віддаленого сервера додати ssl сертифікат як пакет доменного кореня cert, проміжний cert та root cert.


-1

Оскільки ви використовуєте Windows, я думаю, що розділювач ваших шляхів є "\" (і "/" в Linux). Спробуйте використовувати константу DIRECTORY_SEPARATOR. Ваш код буде більш портативним.

Спробуйте:

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

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


1
Це не має значення, оскільки фактичні налаштування CURL виходять з-під контролю, коли ви використовуєте саме цю бібліотеку Stripe.
Ja͢ck

-1

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

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

працює для php5.3 +


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