PHP CURLSSLOPT_NATIVE_CA возвращает ‘Проблема с SSL сертификатом: невозможно получить локальный сертификат удостоверяющего центра’

Вопрос или проблема

Я пытаюсь получить доступ к URL, который имеет SSL-сертификацию и использует https с помощью PHP curl в среде Windows Server 2016. Параметры curl в коде PHP установлены следующим образом:

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://awebsite.com",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_SSL_OPTIONS => CURLSSLOPT_NATIVE_CA, 
]);

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

Приведенный выше код curl возвращает следующую ошибку: Проблема с SSL-сертификатом: не удалось получить сертификат локального центра сертификации
Версия PHP 8.3.12, а версия расширения curl 8.7.0.
Расширение php_openssl.dll включено в php.ini.
‘CURLSSLOPT_NATIVE_CA’ определено: я проверил это с помощью функции PHP ‘defined’

Если я применяю альтернативное решение и устанавливаю в файле php.ini curl.cainfo на файл cacert.pem, загруженный из проекта Curl (в этом случае CURLOPT_SSL_OPTIONS не установлен), я могу получить доступ к URL.

Я бы хотел использовать опцию CURLSSLOPT_NATIVE_CA, но, похоже, что эта настройка игнорируется или PHP/curl не может получить доступ к корневым сертификатам системы, определенным в Windows Server.
Может быть, какие-то настройки в окружении Windows и/или PHP отсутствуют?
В противном случае, что еще можно сделать, чтобы исправить эту проблему?

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что CURL не может найти или получить доступ к корневым сертификатам на вашей системе Windows Server 2016, когда вы используете опцию CURLSSLOPT_NATIVE_CA. Вот несколько шагов, которые могут помочь решить эту проблему.

Шаг 1: Убедитесь, что сертификаты установлены

  1. Перейдите в Панель управленияАдминистрированиеУправление сертификатами.
  2. Проверьте, установлены ли корневые сертификаты, необходимые для проверки SSL-сертификатов. Необходимые сертификаты можно увидеть в разделе Доверенные корневые центры сертификации.

Шаг 2: Обновление корневых сертификатов Windows

Иногда проблема может быть вызвана устаревшими корневыми сертификатами. Убедитесь, что ваша система Windows обновлена. Вы можете использовать Windows Update для установки последних обновлений безопасности, которые могут включать обновления корневых сертификатов.

Шаг 3: Использование системного хранилища сертификатов

PHP и cURL могут полагаться на системное хранилище сертификатов. Если вы хотите использовать опцию CURLSSLOPT_NATIVE_CA, убедитесь, что cURL может получить доступ к системному хранилищу сертификатов. Для этого выполните следующие действия:

  1. Убедитесь, что необходимые разрешения на доступ к хранилищу сертификатов установлены.
  2. Убедитесь, что на сервере установлены все необходимые обновления для Windows и cURL.

Шаг 4: Проверка версии cURL и OpenSSL

Проверьте, что версия библиотек cURL и OpenSSL на вашем сервере актуальна. Иногда устаревшие библиотеки могут вызывать проблемы с проверкой сертификатов.

  1. Вы можете сделать это, запустив команду в терминале PHP:
    phpinfo();

    Найдите информацию о версиях cURL и OpenSSL.

Шаг 5: Использование cacert.pem в качестве альтернативного решения

Если после выполнения всех вышеуказанных шагов проблема не устраняется, вы можете продолжить использовать cacert.pem, как вы уже упоминали. Для этого добавьте следующую строку в ваш php.ini:

curl.cainfo = "C:\path\to\cacert.pem"

Затем перезапустите веб-сервер (например, Apache или Nginx) чтобы изменения в php.ini вступили в силу. Этот метод также обеспечивает возможное решение проблемы с сертификатами.

Заключение

В целом, цель состоит в том, чтобы убедиться, что cURL может корректно получить доступ к корневым сертификатам. Если у вас есть возможность использовать систему для получения сертификатов, это предпочтительный вариант. В противном случае использование cacert.pem будет надежным обходным путем. Если у вас остались вопросы или требуется дополнительная помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...