Ошибка "cURL error 60: SSL certificate problem: unable to get local issuer certificate" — причины и решения

 При использовании библиотеки cURL в PHP для выполнения HTTPS-запросов может возникнуть ошибка: "cURL error 60: SSL certificate problem: unable to get local issuer certificate". Эта проблема связана с тем, что cURL не может подтвердить подлинность SSL-сертификата удаленного сервера из-за отсутствия доверенного корневого сертификата в локальном хранилище. В результате приложение не может установить безопасное соединение с сервером, что препятствует обмену данными.

Почему возникает эта ошибка

Основная причина ошибки заключается в том, что cURL не находит или не может получить доступ к файлу сертификатов удостоверяющих центров (CA bundle). Возможные причины:

  • Отсутствует файл cacert.pem в системе или он поврежден.
  • Неправильно указан путь к файлу сертификатов в настройках PHP или в коде приложения.
  • Используется устаревший файл сертификатов, который не содержит актуальных корневых сертификатов.

Как решить проблему

1. Скачайте и установите актуальный файл сертификатов

Первым шагом рекомендуется загрузить свежий файл сертификатов cacert.pem с официального ресурса cURL. После загрузки поместите этот файл в надежное место на сервере, например, в директорию /usr/local/share/ca-certificates/ или любую другую, удобную для вашего окружения.

2. Настройте PHP для использования файла сертификатов

После размещения файла cacert.pem необходимо указать PHP, где находится этот файл. Откройте файл конфигурации PHP php.ini и добавьте или измените следующие строки, указав корректный путь к сертификату:

curl.cainfo = "/usr/local/share/ca-certificates/cacert.pem"
openssl.cafile = "/usr/local/share/ca-certificates/cacert.pem"

После сохранения изменений перезапустите веб-сервер (Apache, Nginx или другой), чтобы новые настройки вступили в силу.

3. Укажите путь к сертификату в коде приложения

Если у вас нет возможности изменить файл php.ini или вы хотите задать путь программно, можно установить опцию CURLOPT_CAINFO непосредственно в скрипте:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CAINFO, "/usr/local/share/ca-certificates/cacert.pem");
$response = curl_exec($ch);
curl_close($ch);

Убедитесь, что путь к файлу cacert.pem соответствует фактическому расположению файла на вашем сервере.

4. Обновите cURL и OpenSSL

Иногда проблема может быть связана с устаревшими версиями cURL или OpenSSL. Обновите эти компоненты до последних стабильных версий с помощью пакетного менеджера вашей операционной системы:

sudo apt-get update
sudo apt-get install --only-upgrade curl openssl

5. Временно отключите проверку SSL (не рекомендуется)

В качестве временного решения можно отключить проверку SSL-сертификата, установив следующие параметры:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

Внимание: Отключение проверки SSL-сертификатов делает соединение небезопасным и может привести к уязвимостям. Рекомендуется использовать этот метод только для отладки и не применять в рабочей среде.

Пример полного кода с указанием пути к сертификату

Ниже приведен пример кода, который демонстрирует, как установить все необходимые параметры для успешного выполнения HTTPS-запроса с использованием cURL:

$ch = curl_init("https://example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CAINFO, "/usr/local/share/ca-certificates/cacert.pem");
$response = curl_exec($ch);

if(curl_errno($ch)){
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo 'Ответ сервера: ' . $response;
}

curl_close($ch);

Связанные ошибки и их решения

При работе с cURL и PHP могут возникать и другие ошибки. Например, cURL error 28: Operation timed out указывает на то, что истекло время ожидания ответа от сервера. Для решения этой проблемы можно увеличить время или проверить доступность сервера.

Кроме того, важно следить за соответствием версий PHP и используемых библиотек. Если версия PHP не соответствует требованиям фреймворка или пакета, может возникнуть ошибка, описанная в статье "Your PHP version does not satisfy that requirement" в Laravel. Обновление версии PHP и зависимостей поможет решить эту проблему.

Рекомендации для PHP-разработчиков

Чтобы избежать подобных ошибок в будущем, рекомендуется регулярно обновлять сертификаты и следить за актуальностью используемых библиотек. Также полезно ознакомиться с лучшими практиками разработки и посетить курсы для PHP-разработчиков, которые помогут повысить квалификацию и оставаться в курсе последних тенденций в индустрии.

Заключение

Ошибка "cURL error 60: SSL certificate problem: unable to get local issuer certificate" связана с проблемами верификации SSL-сертификата из-за отсутствия актуального файла сертификатов CA. Следуя описанным шагам по обновлению и настройке сертификатов, вы сможете устранить эту проблему и обеспечить безопасное соединение с удаленными серверами. Важно поддерживать ваше окружение в актуальном состоянии и внимательно следить за настройками безопасности.