it-swarm.com.ru

HTTPS и SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата, CA в порядке

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

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

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

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

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

202
Josnidhin

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

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

142
Marc B

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

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

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

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

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
285
Артур Курицын

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

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

curl_exec():

в файле php.

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

83
Chris Dutrow

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

Curl: проблема с сертификатом 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 и др., Вы можете безопасно сравнить его с пакетом сертификатов CA 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");

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

52
Deepak Oberoi

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

16
Nate

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

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

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

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

В моем случае мне пришлось установить переменную 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.

4
Spencer Williams

У меня такая же ошибка на 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"
4
Reinaldo Mendes

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

3
LOwens1931

Я попал сюда, когда пытался заставить 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 и протестируйте.

1
TrophyGeek

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

0
site