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.