HTTPS и SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не выполнена, CA в порядке

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

С PHP 5.3.7 вы можете сделать:

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

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

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

Ответ 3

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

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

перед звонком:

curl_exec():

в файле php.

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

Ответ 4

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

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

07 апреля 2006 г.

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

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

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

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

//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, который вы используете для доступа к удаленному ресурсу. Это здоровый чек, но он не гарантирует, что ваша программа не является decieved.

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

Ваша программа может быть введена в заблуждение при разговоре с другим сервером вместо. Это может быть достигнуто с помощью нескольких механизмов, таких как dns или arp отравление (Это история на другой день). Нарушитель может также самостоятельно подписывать сертификат с тем же именем "comon" вашей программы ожидание. Связь по-прежнему будет зашифрована, но вы отдавать свои секреты самозванцу. Этот вид атаки называемый "человек посередине"

Поражение "человек посередине"

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

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

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

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

for All above Info Credit Переход к: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

Ответ 5

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

TL; DR

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

Ответ 6

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

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

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

Ответ 7

У меня такая же ошибка на Amazon AMI Linux.

Я решил, установив 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"

Ответ 8

За любовь ко всему, что свято...

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

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

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

Ответ 9

При настройке параметров curl для 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, я могу найти обе ссылки на скручивание в одной области.)

Ответ 10

Я оказался здесь, пытаясь получить 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/поиск других в цепочке, если они вам понадобятся.

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

Пример изображения сертификата

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

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

Ответ 11

Вы можете попытаться переустановить пакет ca-certificates или явно разрешить соответствующий сертификат, как описано здесь.

Ответ 12

Решение очень простое! Поместите эту строку до curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Для меня это работает.