Вопрос или проблема
На моем сервере нет SSL-сертификата для большего контекста.
Я заметил эту проблему только в IIS, вот пример кода, который вы можете использовать для воспроизведения моей проблемы
<?php
$ch = curl_init();
$url = "https://example.com";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
Я могу совершать успешные HTTP-запросы только по протоколу HTTP как с помощью cURL, так и с помощью file_get_contents()
, но получаю ошибки при использовании file_get_contents()
для запроса по URL-адресу HTTPS и ничего не происходит при использовании cURL для запроса по URL-адресу HTTPS.
Я пытался поиграться с openssl.cafile
и curl.cainfo
, но безуспешно, как указано в ответе.
Также установил allow_url_fopen = On
и allow_url_include = On
в php.ini
и включил расширение php OpenSSL согласно этой документации PHP
Я заметил эту проблему только в документе PHP, выполняющемся под IIS. Все работает как задумано в интерактивной оболочке PHP.
Вот мой php.ini
, если это поможет, и мой web
Ответ или решение
Чтобы получить доступ к HTTPS URL-адресам в PHP 8.3.10, работающем на IIS 10, необходимо выполнить несколько шагов, чтобы убедиться, что cURL может правильно обрабатывать HTTPS-запросы, даже если у вас нет установленного SSL-сертификата на сервере. Вот полное руководство по решению вашей проблемы.
1. Убедитесь, что открыты необходимые расширения
Ваша версия PHP должна иметь включённые расширения OpenSSL и cURL. Проверьте файл php.ini
на наличие следующих строк:
extension=openssl
extension=curl
Если эти строки закомментированы (начинаются с ;
), уберите символ ;
и сохраните изменения.
2. Настройка параметров cURL для незащищённого соединения
Поскольку у вас нет SSL-сертификата и вы сталкиваетесь с проблемами безопасности при выполнении HTTPS-запросов, вы можете настроить cURL, чтобы игнорировать проверки SSL. Это можно сделать с помощью следующих параметров:
$ch = curl_init();
$url = "https://example.com";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // Отключаем проверку имени хоста
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Отключаем проверку SSL-сертификата
$response = curl_exec($ch);
if ($response === false) {
echo 'Ошибка cURL: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
Важно: Отключение проверки SSL может быть небезопасным, и поэтому не рекомендуется для производственной среды. Старайтесь использовать этот подход только для разработки или тестирования.
3. Использование file_get_contents()
Если вы хотите использовать функцию file_get_contents()
для доступа к HTTPS URL, убедитесь, что функция настроена схожим образом. Однако, стоит отметить, что эта функция может также сталкиваться с проблемами в случае отсутствия SSL-сертификата. Вы можете попробовать следующий код:
$options = [
"ssl" => [
"verify_peer" => false,
"verify_peer_name" => false,
],
];
$url = "https://example.com";
$response = @file_get_contents($url, false, stream_context_create($options));
if ($response === false) {
echo "Ошибка file_get_contents: " . error_get_last()['message'];
} else {
echo $response;
}
4. Проверьте конфигурацию IIS
Убедитесь, что IIS настроен для работы с PHP и что на сервере правильно установлены права доступа для выполнения PHP-скриптов. Также проверьте настройки вашего сайта в IIS, чтобы убедиться, что он не блокирует HTTPS-запросы.
5. Проверка системных сертификатов
Некоторые разладки могут возникнуть из-за проблем с корневыми сертификатами на вашем сервере. Убедитесь, что используете актуальные корневые сертификаты. Вы можете скачать их и установить, если это необходимо.
Заключение
Следуя этим рекомендациям, вы сможете получить доступ к HTTPS URL-адресам в PHP под IIS. Обязательно протестируйте свои изменения в безопасном окружении и подумайте о получении SSL-сертификата для повышения безопасности вашего приложения.