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

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

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

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

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

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

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

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

Это довольно распространенная проблема в 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"); 

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

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

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

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

 curl_exec(): 

в файле php.

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

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

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

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

Поражение «человека в середине»

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

Если удаленный ресурс защищен сертификатом, выпущенным одним из основных CA, таких как 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"); 

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

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

В итоге я обнаружил, что у WampServer есть два файла php.ini :

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

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

TL; DR

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

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

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

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

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

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

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

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

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

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

Я решил, установив curl.cainfo на /etc/php.d/curl.ini

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

Я оказался здесь, пытаясь получить GuzzleHttp (php + apache на Mac), чтобы получить страницу с сайта http://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 и проверьте.