HTTPS и SSL3 получают сертификат сервера:ошибка проверки сертификата, CA в порядке

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

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

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

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

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

11 ответов


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

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


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

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

  1. скачать https://curl.haxx.se/ca/cacert.pem и сохраните его где-нибудь.
  2. обновление php.ini -- добавить завиток.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 с завитком вы можете получить следующую ошибку:

проблема с сертификатом 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 (это значение по умолчанию) будет гарантировать что сертификат, представленный вам, имеет "общее имя" сопоставление урны, используемой для доступа к удаленному ресурсу. Это здоровая проверка, но это не гарантирует, что ваша программа не будет введены в заблуждение.

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

ваша программа может быть введена в заблуждение в разговор с другим сервером вместо. Это может быть достигнуто с помощью нескольких механизмов, таких как dns или отравление arp (это история для другого дня). Злоумышленник может также собственн-подпишите сертификат с таким же "именем comon" ваша программа ожидает. Сообщение все еще было бы зашифровано, но вы бы выдавать свои секреты самозванцу. Этот вид нападения называется "Человек посередине"!--8-->

победить "человека в середине"

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

Если удаленный ресурс защищен сертификатом, выданным одним из главные CA как Verisign, GeoTrust et al, вы можете безопасно сравнить против пакета сертификатов 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


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


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

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

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

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


ради любви ко всему святому...

в моем случае я должен был установить openssl.cafile переменная конфигурации PHP для пути к файлу PEM.

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

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


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

Я решил, установив завиток.cainfo on / etc / php.д/завиток.ini

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


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


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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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