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 вы можете сделать:
- скачать https://curl.haxx.se/ca/cacert.pem и сохраните его где-нибудь.
- обновление
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
я оказался здесь, когда пытался получить 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 и проверьте.
решение очень простое! Поставьте эту строку перед curl_exec
:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
для меня это работает.