Сообщение SSL certificate problem: unable to get local issuer certificate означает, что клиент не смог построить проверенную цепочку доверия. Оно не доказывает, что у сервера вообще нет сертификата. В локальных PHP-окружениях причиной бывает отсутствующее или устаревшее хранилище доверенных центров, но проверять нужно обе стороны соединения.
Сначала выяснить, где работает PHP
PHP из командной строки и PHP веб-сервера могут читать разные php.ini. Проверьте реально загруженную конфигурацию в том окружении, где возникает ошибка. Не оставляйте публичную страницу phpinfo() после диагностики: она раскрывает сведения об установке.
php --ini
php -r "echo ini_get('curl.cainfo'), PHP_EOL;"Эти команды проверяют CLI, а не автоматически конфигурацию Apache или PHP-FPM. После изменения конфигурации перезапустите соответствующий процесс и повторите тот же запрос.
Настроить доверенные CA, сохраняя проверку
Если сборке PHP требуется файловый CA bundle, используйте доверенный актуальный набор корневых сертификатов. Страница curl о проверке TLS объясняет различие системного хранилища и файлового набора. Путь в curl.cainfo должен быть абсолютным; это указано в конфигурации PHP cURL.
; Пример пути, а не обязательный каталог установки
curl.cainfo="C:/php/certs/cacert.pem"
; Для PHP OpenSSL streams настройка отдельная
openssl.cafile="C:/php/certs/cacert.pem"Файл должен существовать и быть доступен процессу PHP. curl.cainfo относится к cURL; openssl.cafile — к проверке средствами расширения OpenSSL. Наличие одного не доказывает правильную настройку другого. Включение Apache mod_ssl само по себе не исправляет исходящий HTTPS-запрос PHP.
Если CA bundle не помог
- Проверьте правильность имени сервера и системного времени.
- На стороне сервера проверьте передачу промежуточных сертификатов; клиентский bundle не должен скрывать неполную конфигурацию сервера.
- Если соединение перехватывает корпоративный TLS-прокси, согласуйте доверенный корневой сертификат с администратором. Не импортируйте случайный сертификат из форума.
- Различайте ошибку проверки сертификата и ошибку чтения файла CA: у libcurl разные коды и сообщения.
Не обходите проблему отключением CURLOPT_SSL_VERIFYPEER или проверки имени. Тогда исчезает гарантия, что данные получает нужный сервер. Исправляйте доверие или цепочку, а затем повторяйте запрос с включённой проверкой.