Я пытался получить доступ к этой конкретной службе REST со страницы PHP, которую я создал на нашем сервере. Я сузил проблему до этих двух строк. Итак, моя страница PHP выглядит так:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
Страница умирает в строке 2 со следующими ошибками:
- Предупреждение: file_get_contents (): сбой операции SSL с кодом 1. Сообщения об ошибках OpenSSL: ошибка: 14090086: процедуры SSL: SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата в ... php в строке 2
- Предупреждение: file_get_contents (): не удалось включить шифрование в ... php в строке 2
- Предупреждение: file_get_contents (
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
): не удалось открыть поток: не удалось выполнить операцию ... php в строке 2
Мы используем сервер Gentoo. Недавно мы обновились до версии PHP 5.6. Именно после обновления появилась эта проблема.
Я обнаружил, когда я заменяю службу REST на адрес, подобный https://www.google.com
; моя страница работает просто отлично.
В более ранней попытке я установил “verify_peer”=>false
и передал это в качестве аргумента file_get_contents, как описано здесь: file_get_contents игнорируя verify_peer => false? Но, как заметил писатель; это не имело никакого значения.
Я спросил одного из наших администраторов сервера, существуют ли эти строки в нашем файле php.ini:
- расширение = php_openssl.dll
- allow_url_fopen = On
Он сказал мне, что, поскольку мы находимся на Gentoo, openssl компилируется при сборке; и это не установлено в файле php.ini.
Я также подтвердил, что allow_url_fopen
работает. В связи со спецификой этой проблемы; Я не нахожу много информации для помощи. Кто-нибудь из вас сталкивался с чем-то подобным? Спасибо.
Ответы:
Это была чрезвычайно полезная ссылка для поиска:
http://php.net/manual/en/migration56.openssl.php
Официальный документ, описывающий изменения, внесенные для открытия ssl в PHP 5.6 Отсюда я узнал еще об одном параметре, который я должен был установить в false: "verify_peer_name" => false
Итак, мой рабочий код выглядит так:
источник
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Вы не должны просто отключить проверку. Скорее вы должны скачать пакет сертификатов, возможно, пакет curl подойдет?
Затем вам просто нужно поместить его на ваш веб-сервер, предоставив пользователю, который запускает php, разрешение на чтение файла. Тогда этот код должен работать для вас:
Надеюсь, корневой сертификат сайта, к которому вы пытаетесь получить доступ, находится в комплекте curl. Если это не так, это все равно не будет работать, пока вы не получите корневой сертификат сайта и не поместите его в файл сертификата.
источник
stream_context_set_default
которую можно использовать, чтобы вам не приходилось каждый раз передавать ее в file_get_contentsЯ исправил это, убедившись, что OpenSSL был установлен на моей машине, а затем добавил это в мой php.ini:
источник
cert.pem
файл и установил вотphp.ini
так, и это сработало:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Вы можете обойти эту проблему, написав пользовательскую функцию, которая использует curl, как в:
Тогда просто используйте
file_get_contents_curl
вместоfile_get_contents
всякий раз, когда вы вызываете URL, который начинается с https.источник
Работая на меня, я использую PHP 5.6. Расширение openssl должно быть включено, и при вызове карты Google API api verify_peer сделать false Ниже код работает для меня.
источник
Если ваша версия PHP 5, попробуйте установить cURL, введя следующую команду в терминале:
источник
cURL
.sudo port install php70-curl
В основном вам нужно установить переменную среды SSL_CERT_FILE в путь к файлу PEM ssl-сертификата, загруженного по следующей ссылке: http://curl.haxx.se/ca/cacert.pem .
Мне понадобилось много времени, чтобы понять это.
источник
следующие шаги помогут решить эту проблему,
curl.cainfo
и вставьте абсолютный путь для загрузки сертификата.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
надеюсь, это поможет !!
источник
Просто хотел добавить к этому, так как столкнулся с той же проблемой, и ничего, что я не мог найти где-либо, не сработало бы (например, загрузка файла cacert.pem, настройка cafile в php.ini и т. Д.)
Если вы используете NGINX и ваш SSL-сертификат поставляется с «промежуточным сертификатом», вам нужно объединить промежуточный файл сертификата с вашим основным файлом «mydomain.com.crt», и он должен работать. Apache имеет настройку, специфичную для промежуточных сертификатов, но NGINX нет, поэтому он должен находиться в том же файле, что и ваш обычный сертификат.
источник
Причиной этой ошибки является то, что в PHP нет списка доверенных центров сертификации.
PHP 5.6 и более поздние версии пытаются автоматически загрузить CA, которым доверяет система. Проблемы с этим можно исправить. См. Http://php.net/manual/en/migration56.openssl.php для получения дополнительной информации.
PHP 5.5 и более ранние версии действительно сложно правильно настроить, так как вам нужно вручную указывать пакет CA в каждом контексте запроса, что не нужно разбрасывать вокруг кода. Поэтому я решил для своего кода, что для версий PHP <5.6, проверка SSL просто отключается:
источник
Была такая же ошибка с PHP 7 на XAMPP и OSX.
Вышеупомянутый ответ в https://stackoverflow.com/ хорош, но он не полностью решил проблему для меня. Мне пришлось предоставить полную цепочку сертификатов, чтобы file_get_contents () снова заработал. Вот как я это сделал:
Получить корневой / промежуточный сертификат
Прежде всего я должен был выяснить, что такое корневой и промежуточный сертификат.
Наиболее удобный способ - это, возможно, онлайн-инструмент для сертификации, такой как ssl-shopper.
Там я нашел три сертификата, один серверный сертификат и два цепных сертификата (один является корневым, другой явно промежуточным).
Все, что мне нужно сделать, это просто искать в Интернете их обоих. В моем случае это корень:
thawte DV SSL SHA256 CA
И это приводит к его URL thawte.com . Так что я просто поместил этот сертификат в текстовый файл и сделал то же самое для промежуточного. Готово.
Получить сертификат хоста
Следующее, что мне нужно было, это загрузить сертификат моего сервера. В Linux или OS X это можно сделать с помощью openssl:
Теперь соберите их всех вместе
Теперь просто объедините их в один файл. (Может быть, хорошо просто поместить их в одну папку, я просто слил их в один файл). Вы можете сделать это так:
скажи PHP где найти цепочку
Есть эта удобная функция openssl_get_cert_locations (), которая скажет вам, где PHP ищет файлы сертификатов. И есть этот параметр, который сообщит file_get_contents (), где искать файлы сертификатов. Может быть, оба способа будут работать. Я предпочел параметр способом. (По сравнению с решением, упомянутым выше).
Так что теперь это мой PHP-код
Вот и все. file_get_contents () снова работает. Без CURL и, надеюсь, без недостатков безопасности.
источник
chain.pem
? Этоchain.crt
?После того, как я стал жертвой этой проблемы в CentOS после обновления php до php5.6, я нашел решение, которое помогло мне.
Получите правильный каталог для ваших сертификатов, который будет размещен по умолчанию с этим
Затем используйте это, чтобы получить сертификат и поместить его в местоположение по умолчанию, найденное из кода выше
источник
У меня была такая же проблема ssl на моей машине разработчика (php 7, xampp на windows) с самозаверяющим сертификатом, который пытался открыть файл « https: // localhost / ...». Очевидно, что сборка корневого сертификата (cacert.pem) не сработала. Я просто скопировал вручную код из apache server.crt-File в скачанный cacert.pem и сделал запись openssl.cafile = path / to / cacert.pem в php.ini
источник
Другая вещь, которую стоит попробовать - это переустановить,
ca-certificates
как описано здесь .И еще одна вещь, которую нужно попробовать, это явно разрешить сертификат одного сайта, о котором идет речь, как описано здесь (особенно, если один сайт является вашим собственным сервером, и у вас уже есть доступ к .pem).
Я столкнулся с этой точной ошибкой SO после обновления до PHP 5.6 на CentOS 6, пытаясь получить доступ к самому серверу, у которого есть сертификат cheapsslsecurity, который, возможно, его нужно было обновить, но вместо этого я установил сертификат letsencrypt, и с этими двумя шагами выше он сделал Хитрость. Я не знаю, почему был необходим второй шаг.
Полезные команды
Посмотреть версию openssl:
Просмотр текущих настроек PHP:
источник
Относительно ошибок, подобных
Вы проверили разрешения сертификата и каталогов, на которые ссылается openssl?
Ты можешь сделать это
Чтобы получить что-то похожее на это
Эта проблема на некоторое время расстроила меня, пока я не понял, что моя папка «certs» имеет 700 разрешений, тогда как она должна была иметь 755 разрешений. Помните, что это не папка для ключей, а сертификаты. Я рекомендую прочитать эту ссылку на разрешения SSL.
Однажды я сделал
Проблема была решена, по крайней мере, для меня в любом случае.
источник
У меня была такая же проблема для другой защищенной страницы при использовании
wget
илиfile_get_contents
. Много исследований (включая некоторые ответы на этот вопрос) привели к простому решению - установке Curl и PHP-Curl - если я правильно понял, у Curl есть Root CA для Comodo, который решил проблемуУстановите Curl и PHP-Curl addon, затем перезапустите Apache
Все сейчас работает.
источник