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

189

Я использую PHP версии 5.6.3 как часть XAMPP в Windows 7.

Когда я пытаюсь использовать Mandrill API, я получаю следующую ошибку:

Неопределенное исключение «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 bit, то это 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 curl.haxx.se/docs/caextract.html
Пол
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 с установленным ampps.

Скопировано: 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"

То же самое для Wamp.

[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
@voidstate Я знаю, что это старый, но вы также можете обойти его в жрете, используя это ['verify' => false], для полного документа по ssl / curl / guzzle
Джон
@ Джон, но это лишит 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 были обновлены и были изменены; ca-bundle изменен на тот, который несовместим с 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, и это должно исправить это (просто остановите и запустите службы по мере необходимости).
HopeKing
источник
11

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

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Маниш шарма
источник
9
Хотя это может сработать, это вообще не рекомендуется. Вы в основном говорите, доверяйте всем сертификатам ... и это также открывает ваше приложение для возможной атаки, если вы забываете, и ваш код делает это в производство с этим изменением ... действительно не так много работы, чтобы загрузить пакет CA и добавить точку PHP к нему.
user919426
это концепция curl, поэтому всякий раз, когда вы используете curl, добавьте приведенный выше код
Маниш Шарма
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);
}

должен выполнить трюк для среды разработки без ущерба для сервера при развертывании.

Ноэль
источник
Выполнение различных частей вашего кода в разных средах не является хорошей концепцией - это усложняет отладку
Nico Haase
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.

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

ccrez
источник
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 с доступом root ssh, то в этом случае вы можете попробовать обновить хранилище сертификатов с помощью следующей команды:

update-ca-certificates

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

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

prasoon
источник
-4

для жреты вы можете попробовать это:

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

проверено на жрет / жрет 3. *

fico7489
источник
1
есть ли смысл отвечать на трехлетний вопрос, на который есть приемлемый ответ с более чем 200 ответами?
treyBake
мой ответ проще, чем выше, вы увидите, я получу 10 голосов за несколько месяцев ...
fico7489
1
Я очень сомневаюсь в этом, не видя упоминания о жрете в OP ... так что это не связанный ответ. То же самое, когда кто-то предоставляет решение jQuery для проблемы JavaScript. Это не имеет значения.
treyBake
это не меняет того факта, что он здесь не используется. Вы бы предложили решение Linux для пользователя Windows, потому что это наиболее используемая серверная операционная система? Не каждый хочет использовать Guzzle, лично я никогда не использовал его один раз за годы использования PHP. Для меня HTTP-запрос на самом деле не так уж и сложен, чтобы получить пакет для него.
treyBake
1
полностью осознавая - это просто не нужно .. просто прочитайте документы для curl, и все это говорит само за себя. Речь идет не о том, чтобы быть умнее ... речь идет о правильном ответе на вопрос
treyBake