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