HTTPS и SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата, CA в порядке - PullRequest
203 голосов
/ 19 июня 2011

Я использую XAMPP для разработки.Недавно я обновил свою установку xampp со старой версии до 1.7.3.

Теперь, когда я скручиваю сайты с поддержкой HTTPS, я получаю следующее исключение

Неустранимая ошибка: необработанное исключение 'RequestCore_Exception' с сообщением 'ресурс cURL: идентификатор ресурса # 55;Ошибка cURL: проблема с сертификатом SSL, проверьте, что сертификат CA в порядке.Подробности: ошибка: 14090086: подпрограммы SSL: SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата (60) '

Все предлагают использовать некоторые конкретные параметры скручивания из кода PHP для решения этой проблемы.Я думаю, что это не должно быть так.Потому что у меня не было никаких проблем с моей старой версией XAMPP, и это произошло только после установки новой версии.

Мне нужна помощь, чтобы выяснить, какие настройки меняются при установке PHP, Apache и т. Д. Могут решить эту проблему.

Ответы [ 12 ]

286 голосов
/ 11 мая 2013

Это довольно распространенная проблема в Windows.Вам нужно просто установить cacert.pem на curl.cainfo.

Начиная с PHP 5.3.7 вы можете сделать:

  1. скачать https://curl.haxx.se/ca/cacert.pem и сохранить его где-нибудь.
  2. update php.ini - add curl.cainfo = "PATH_TO / cacert.pem"

В противном случае вам потребуется выполнить следующее для каждого ресурса cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
142 голосов
/ 19 июня 2011

curl используется для включения списка принятых CA, но больше не связывает ЛЮБЫЕ сертификаты CA.Поэтому по умолчанию он отклоняет все SSL-сертификаты как не поддающиеся проверке.

Вы должны будете получить сертификат своего СА и указать на него скручивание.Подробнее на в cURLS Подробнее о серверных SSL-сертификатах .

83 голосов
/ 12 мая 2012

Предупреждение: это может привести к проблемам безопасности, от которых защищен протокол SSL, что делает вашу кодовую базу небезопасной.Это идет вразрез с любой рекомендованной практикой.

Но для меня действительно простым решением было позвонить:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

перед вызовом:

curl_exec():

в файле php.

Я считаю, что это отключает все проверки SSL-сертификатов.

52 голосов
/ 06 сентября 2012

Источник: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Завиток: проблема с сертификатом SSL, проверьте, что сертификат CA в порядке

07 апреля 2006

При открытииВ безопасном URL с помощью Curl вы можете получить следующую ошибку:

Проблема с сертификатом SSL, проверьте, что сертификат CA в порядке

Я объясню, почему возникла ошибка и что вы должны с ней делать.

Самый простой способ избавиться от ошибки - добавить следующие две строки в ваш скрипт.Это решение создает угрозу безопасности.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Давайте посмотрим, что делают эти два параметра.Цитирование руководства.

CURLOPT_SSL_VERIFYHOST : 1, чтобы проверить наличие общего имени в сертификате SSL-партнера.2, чтобы проверить наличие общего имени, а также убедиться, что оно соответствует указанному имени хоста.

CURLOPT_SSL_VERIFYPEER : FALSE, чтобы CURL не проверял сертификат партнера.Альтернативные сертификаты для проверки можно указать с помощью параметра CURLOPT_CAINFO или каталог сертификатов можно указать с помощью параметра CURLOPT_CAPATH.CURLOPT_SSL_VERIFYHOST может также иметь значение TRUE или FALSE, если CURLOPT_SSL_VERIFYPEER отключен (по умолчанию 2).Установка CURLOPT_SSL_VERIFYHOST в 2 (это значение по умолчанию) гарантирует, что представляемый вам сертификат имеет «общее имя», соответствующее URN, который вы используете для доступа к удаленному ресурсу.Это проверка работоспособности, но она не гарантирует, что ваша программа не будет принята.

Введите «человек посередине»

Вместо этого ваша программа может быть введена в заблуждение, чтобы перейти к другому серверу.Это может быть достигнуто с помощью нескольких механизмов, таких как отравление днс или арп (это история для другого дня).Злоумышленник также может самостоятельно подписать сертификат с тем же «общим именем», которое ожидает ваша программа.Сообщение будет по-прежнему зашифровано, но вы будете передавать свои секреты самозванцу.Такого рода атака называется «человек посередине»

Победа над «человеком посередине»

Что ж, нам нужно убедиться, что представляемый нам сертификат действительно хорош.Мы делаем это, сравнивая его с сертификатом, которому мы разумно * доверяем.

Если удаленный ресурс защищен сертификатом, выданным одним из главных ЦС, таким как Verisign, GeoTrust и др., Вы можете безопасно сравнить его с ЦС Mozilla.комплект сертификатов, который вы можете получить из http://curl.haxx.se/docs/caextract.html

Сохраните файл cacert.pem где-нибудь на вашем сервере и установите следующие параметры в вашем скрипте.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

для All вышеИнформационный кредит: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

16 голосов
/ 07 сентября 2014

Вышеуказанные решения хороши, но если вы используете WampServer, вы можете обнаружить, что установка переменной curl.cainfo в php.ini не работает.

Я обнаружил, что WampServer имеет два файла php.ini:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Первый, по-видимому, используется, когда файлы PHP вызываются через веб-браузер, а второй используется, когда команда вызывается из командной строки, или shell_exec().

* 1011.* TL; DR

При использовании WampServer необходимо добавить строку curl.cainfo к обоим php.ini файлам.

6 голосов
/ 28 февраля 2017

Ради любви всего святого ...

В моем случае мне пришлось установить переменную PHP openssl.cafile в путь к файлу PEM.

Я верю, что это очень верно, что есть много систем, где установка curl.cainfo в конфигурации PHP именно то, что нужно, но в среде, с которой я работаю, это eboraas / laravel Контейнер Docker, который использует Debian 8 (jessie) и PHP 5.6, установив эту переменную, не сработал.

Я заметил, что вывод php -i ничего не упомянул об этом конкретном параметре конфигурации, но в нем было несколько строк о openssl. Существует и опция openssl.capath, и openssl.cafile, но установка второго позволила curl через PHP окончательно работать с HTTPS URL.

4 голосов
/ 09 октября 2014

У меня такая же ошибка на amazon AMI linux.

I Решено установкой curl.cainfo на / etc / php.d / curl.ini

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

Добавление, октябрь 2018

В Amazon Linux v1 отредактируйте этот файл

vi /etc/php.d/20-curl.ini

Чтобы добавить эту строку

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
4 голосов
/ 18 декабря 2013

Иногда, если приложение, с которым вы пытаетесь связаться, имеет самозаверяющие сертификаты, обычный cacert.pem из http://curl.haxx.se/ca/cacert.pem не решает проблему.

Если вы уверены в URL-адресе конечной точки службы, нажмите его через браузер, сохраните сертификат вручную в формате «X 509 сертификат с цепочкой (PEM)». Укажите этот файл сертификата с помощью

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
3 голосов
/ 30 сентября 2014

При настройке параметров скручивания для CURLOPT_CAINFO, пожалуйста, не забудьте использовать одинарные кавычки, использование двойных кавычек вызовет только еще одну ошибку.Таким образом, ваш вариант должен выглядеть следующим образом:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Кроме того, в настройках вашего файла php.ini должно быть написано следующее: (обратите внимание на мои двойные кавычки)

curl.cainfo = "C:\wamp\www\mywebfolder"

Я поместил его прямо нижестрока, которая говорит это: extension=php_curl.dll

(Только для целей организации, вы можете поместить его в любое место в пределах php.ini, я просто поместил его рядом с другой ссылкой на curl, поэтому при поиске по ключевому слову curl я могунайти обе ссылки на локоны в одной области.)

2 голосов
/ 19 апреля 2017

Я попал сюда при попытке получить GuzzleHttp (php + apache на Mac), чтобы получить страницу с www.googleapis.com.

Вот мое окончательное решение на случай, если оно кому-нибудь поможет.

Посмотрите на цепочку сертификатов для любого домена, который дает вам эту ошибку.Для меня это был googleapis.com

openssl s_client -host www.googleapis.com -port 443

Вы получите что-то вроде этого:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Примечание. Я зафиксировал это после того, как исправил проблему,цепочка вывода может выглядеть по-разному.

Тогда вам нужно взглянуть на сертификаты, разрешенные в php.Запустите phpinfo () на странице.

<?php echo phpinfo();

Затем найдите файл сертификата, который загружен из вывода страницы:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Этот файл необходимо исправитьдобавив к нему правильные сертификаты.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

В основном вам необходимо добавить правильные "подписи" сертификатов в конец этого файла.

Некоторые из них можно найти здесь: Возможно, вам понадобится Google / выполнить поиск других в цепочке, если они вам нужны.

Они выглядят так:

example certificate image

( Примечание. Это изображение, поэтому люди не будут просто копировать / вставлять сертификаты изstackoverflow )

Как только нужные сертификаты будут в этом файле, перезапустите apache и протестируйте.

...