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

Я запускаю 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, но все равно получили ту же ошибку.

Я действительно не знаю, что еще попробовать.

Может ли кто-нибудь посоветовать, что еще я могу попробовать?

Ответ 1

Наконец-то получил это на работу!

  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.

Ответ 2

Отказ от ответственности: этот код делает ваш сервер небезопасным.

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

Добавьте следующие две строки:

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

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

Ответ 3

Спасибо @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.

Ответ 4

Когда вы просматриваете страницу http://curl.haxx.se/docs/caextract.html, вы можете заметить большими буквами секцию:

Удаленный RSA-1024

Прочитайте его, затем загрузите версию сертификатов, которая включает сертификаты "RSA-1024". https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Те будут работать с Mandrill.

Отключение SSL - плохая идея.

Ответ 5

Вышеупомянутые шаги, хотя и полезны, не работали для меня в 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, и он должен его исправить (просто остановитесь и запустите услуг по мере необходимости).

Ответ 6

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

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

Ответ 7

Если у вас нет доступа к 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.

Ответ 8

используя вышеприведенные ответы для развертывания сервера.

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

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

Ответ 9

У меня была такая же проблема при создании моего приложения в 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

Ответ 10

Если ни одно из вышеперечисленных решений не работает, попробуйте обновить установку XAMPP до более новой версии.

Я запускал XAMPP с php 5.5.11, тот же самый точный код не работал, я обновился до XAMPP с php 5.6.28, а вышеописанные решения.

Кроме того, обновление только PHP не сработало или похоже на комбинацию параметров apache и php на этой версии XAMPP.

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

Ответ 11

Если вы знаете, что сам xampp уже снабжает источник, см. и учебник

Ответ 12

У меня очень простое решение этой проблемы. Вы можете сделать это без какого-либо файла сертификата..

Перейдите на Laravel Root Folder → 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... Это решение работает для меня. Я нахожу это решение после многих исследований...

Ответ 13

Я пробовал это работает

открыть

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;

Ответ 14

Я получил ошибку как:

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 done.

Надеюсь, что это может помочь кому-то

Ответ 15

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

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

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