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


189

Я використовую PHP версії 5.6.3 як частина XAMPP в Windows 7.

Коли я намагаюся використовувати API Mandrill, я отримую таку помилку:

Невизначений виняток "Mandrill_HttpError" з повідомленням "Виклик API до повідомлень / шаблон відправки не вдався: проблема з сертифікатом SSL: неможливо отримати сертифікат локального емітента"

Я вже спробував усе, що я прочитав у StackOverflow, включаючи додавання наступного до файлу php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

І звичайно, завантажив у це місце файл cacert.pem з http://curl.haxx.se/docs/caextract.html

але зрештою це перезапустило сервери XAMPP і Apache, але все-таки отримує ту ж помилку.

Я справді не знаю, що ще спробувати.

Хтось може порадити, що ще я можу спробувати?


Дивіться мої відповіді: stackoverflow.com/a/29649024/660410
— Michal-sk

3
Також переконайтесь, що ви прокоментували цей рядок, видаливши початковий ';'. це має бути curl.cainfo = "C: \ xampp \ php \ cacert.pem", а не; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
— Джон Тан

Чи використання HTTPS через HTTP також спричинить цю помилку?
— javiniar.leonard

Відповіді:


366

Нарешті дійшло до роботи!

  1. Завантажте пакет сертифікатів .

  2. Покладіть його кудись. У моєму випадку це був c:\wamp\каталог (якщо ви використовуєте Wamp 64 біт, то це c:\wamp64\).

  3. Увімкнути mod_sslв Apache та php_openssl.dllв php.ini(відменте їх, видаливши ;на початку). Але будьте обережні, моя проблема полягала в тому, що у мене було два php.iniфайли, і мені потрібно зробити це в обох. Один - це той, який ви отримуєте від значка панелі завдань WAMP, а інший - у моєму випадкуC:\wamp\bin\php\php5.5.12\

  4. Додайте ці рядки до свого php.iniфайлу в обох файлах:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Перезапустіть послуги Wamp.


3
У моєму випадку це був каталог c: \ xamp \ та його windows 7, і це рішення працює чудово ... дякую багато ...
— Manu RS

1
Новітній пакет сертифікатів можна завантажити з оригінального сайту локон curl.haxx.se/docs/caextract.html
— Paul

1
У моєму випадку рядок був ;на початку, і мені знадобилося кілька годин, щоб зрозуміти, що це означає, що це коментар. тому для нубов як я, потрібно видалити , ;а також
— abhyudayasrinet

1
@SurajNeupane не впевнений, я витратив багато часу, щоб повернути цю, тоді я використовую віртуальні машини, як Homestead, і мені з цим не доводиться стикатися. Це був конкретний випадок
— Младен Яньєтович

2
Це ключовеBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
— AA

127

Відмова: Цей код робить ваш сервер незахищеним.

У мене була така ж проблема у файлі Mandrill.php після рядка № 65, де написано $ this-> ch = curl_init ();

Додайте наступні два рядки:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Це вирішило мою проблему, а також надіслав електронний лист за допомогою localhost, але я пропоную НЕ використовувати його в прямому ефірі. На вашому живому сервері код повинен працювати без цього коду.


1
я можу спробувати змусити середовище розробників працювати без цього обходу?
— Дор Дадуш

4
для мене, тільки налаштувавшись CURLOPT_SSL_VERIFYPEERна falseроботу.
— Франциско Корралес Моралес

29
Якщо ви технічно правильні, відключення SSL - це погана ідея. Навіть у localhost краще грамотно завантажувати сертифікати, як зазначено в іншій відповіді.
— Спинальний

Якщо ви технічно правильний, відключення SSL - це погана ідея. Навіть якщо він дуже стійкий до роботи будь-яким іншим способом, краще втратити роботу, ніж робити речі не належним чином системою-адміністратором. @Spinal

45

Дякую @Mladen Janjetovic,

Ваша пропозиція працювала для мене в Mac із встановленими підсилювачами.

Скопійовано: http://curl.haxx.se/ca/cacert.pem

До: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

І оновив php.iniцей шлях і перезапустив Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

І застосовано те саме налаштування в установці Windows AMPPS, і воно прекрасно працювало і в ньому.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Те саме для вогня.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Якщо ви шукаєте генерувати новий сертифікат SSL за допомогою SAN для localhost, кроки на цій публікації працювали для мене далі Centos 7 / Vagrant / Chrome Browser.


18

Переглядаючи сторінку http://curl.haxx.se/docs/caextract.html , ви побачите великими літерами розділ під назвою:

RSA-1024 видалено

Прочитайте його, а потім завантажте версію сертифікатів, що включає сертифікати 'RSA-1024'. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Вони працюватимуть з Mandrill.

Відключення SSL - погана ідея.


1
Це вирішило проблему з AWS / Guzzle / cURL, з якою я борюся цілий день. Дякую!
— недійсна

@voidstate Я знаю, що це старе, але ви також можете його обійти в guzzle, використовуючи це ['verify' => false], для повного документа на ssl / curl / guzzle перейдіть сюди guzzle.readthedocs.org/en/latest/…
— Іван

@John, але це могло б використовувати перевірку SSL, яка не є тим, що ви хочете робити, тому я б не пропонував це робити.
— Артуро Альварадо

1
Для Windows вам потрібно буде зберегти файли на вашому сервері (наприклад, до C: \ curl \ curl-ca-bundle.crt), а потім додати в php.ini наступне: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
— voidstate

У мене це було лише після того, як він працював ідеально протягом століть (навіть пережив зміну сервера), але у мене виникають проблеми з розумінням того, що відбувається тут. Це curl або openssl було оновлено і чи було воно; s-пакет пакетів змінився на такий, який не сумісний з mailchimp?
— Саммайе

11

Наведені вище кроки, хоч і корисні, але не працювали для мене в Windows 8. Я не знаю співвідношення, але наведені нижче кроки спрацювали. В основному це зміна файлу cacert.pem. Сподіваюся, що це комусь допоможе.

  • Завантажте файл cacert.pem звідси: http://curl.haxx.se/docs/caextract.html
  • Збережіть файл у папці установки PHP. (наприклад: Якщо використовується xampp - збережіть його в c: \ Installation_Dir \ xampp \ php \ cacert.pem).
  • Відкрийте файл php.ini та додайте ці рядки:
  • curl.cainfo = "C: \ Installation_Dir \ xampp \ php \ cacert.pem" openssl.cafile = "C: \ Installation_Dir \ xampp \ php \ cacert.pem"
  • Перезавантажте сервер Apache і це повинно виправити (просто зупиніться та запустить сервіси за потребою).

11

Я знайшов нове рішення без необхідної сертифікації для виклику curl лише додати два коду рядка.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
Хоча це може працювати, це зовсім не рекомендується. Ви, по суті, говорите, довіряйте всім сертифікатам ... і це також відкриває вашу програму для можливої ​​атаки, якщо ви забудете, і ваш код змушує виробляти це виробництво з цією зміною ... насправді не дуже багато роботи над завантаженням пакету CA та додайте до нього точку PHP.
— user919426

це концепція curl, тому щоразу, коли ви використовуєте curl, додайте вище код
— Manish sharma

8

Якщо у вас немає доступу до php.ini , додавання цього коду (за вашим $ch = curl_init();рядком) працює для мене:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Потім вам просто потрібно буде завантажити ca-bundle.crt і зберегти його у вказаному вами місці $certificate_location.


3

У мене дуже просте рішення цієї проблеми. Це можна зробити без жодного файлу сертифікатів ..

Перейдіть на кореневу папку Laravel -> Vender -> guzzlehttp -> guzzle -> src

відкрити Client.php

знайти масив $ за замовчуванням. які виглядають приблизно так ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Тепер головна робота полягає у зміні значення ключа підтвердження ..

'verify'          => false,

Тож після цього він не перевірятиме SSL-сертифікат на запит CURL ... Це рішення для мене працює. Я знаходжу це рішення після багатьох досліджень ...


2

докладніше відповіді на розгортання сервера.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

повинні зробити фокус для середовища розробки, не піддаючи шкоди серверу при його розгортанні.


Запуск різних частин коду в різних середовищах не здається гарною концепцією - це ускладнює налагодження
— Ніко Хааз

2

Я спробував це працює

відчинено

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

і змінити це

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

до цього

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

У мене була така ж проблема під час створення програми в AppVeyor.

  • Завантажте https://curl.haxx.se/ca/cacert.pem наc:\php
  • Увімкнути openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Знайдіть сертифікатecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

Якщо жодне з вищезазначених рішень не працює для вас, спробуйте оновити установку XAMPP до нової версії.

Я запускав XAMPP з php 5.5.11, той самий точний код не працював, я перейшов до XAMPP з php 5.6.28 і рішення вище працювали.

Крім того, лише оновлення PHP не спрацювало, схоже, це комбінація параметрів apache та php у цій версії XAMPP.

Сподіваюся, це комусь допоможе.


0

Я отримав помилку на зразок:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Я використовую машину Windows. Тому я дотримувався наступних кроків.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Сподіваюся, це може комусь допомогти


0

Я зіткнувся з такою проблемою в моїй локальній системі, але не на живому сервері. На цій сторінці я також згадав про інше рішення, але це не працювало в localhost. Тому знайдіть нове рішення цього питання, що працює на сервері localhost-WAMP .

CURL Помилка №: Проблема сертифіката SSL: неможливо отримати сертифікат локального емітента

іноді система не змогла знайти ваш cacert.pem у вашому приводі. тож ви можете визначити це у своєму коді, де ви збираєтесь використовувати CURL

Зауважте, що я виконую всі умови для цієї активної бібліотеки OPEN-SSL та інших речей.

перевірити цей код CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

але це рішення може не працювати на активному сервері. через абсолютний шлях cacert.pem


0

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

update-ca-certificates

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

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


-4

для guzzle ви можете спробувати це:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

випробуваний на рушниці / guzzle 3. *


1
Чи є сенс відповіді на 3-річне запитання, у якому є прийнята відповідь із 200+ оновленнями?
— treyBake

моя відповідь простіша, ніж вище, ви побачите, що я отримаю 10 оновлень за кілька місяців ...
— fico7489

1
Я дуже сумніваюся в цьому, не бачачи жодної згадки про загадку в ОП ... тож це незв'язана відповідь. Це те саме, коли хтось надає рішення jQuery для проблеми JavaScript. Це не має значення.
— treyBake

це не змінює факту, що його тут не використовують. Ви б запропонували користувачеві Windows рішення для Linux, оскільки це найбільше використовується операційна система сервера? Не всі хочуть використовувати Guzzle, я особисто жодного разу не використовував її за свої роки використання PHP. Для мене запит HTTP насправді не так складно, що для нього потрібен пакет.
— treyBake

1
цілком усвідомлюючи - це просто не потрібно .. просто прочитайте документи для скручування і все це само собою зрозуміло. Справа не в тому, щоб бути розумнішими ... це в тому, щоб правильно відповісти на питання
— treyBake
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.