progcode_D / PHP / WEB

PHP

Ошибка PHP. SSL certificate error: unable to get local issuer certificate

Диагностика ошибки цепочки доверия в PHP cURL: правильный php.ini, CA bundle и проверка серверных промежуточных сертификатов.

Сообщение 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.

Сертификат сервера проверяется через промежуточный CA до доверенного корневого CA клиента
Сервер передаёт свою часть цепочки; корневому CA клиент должен доверять независимо от сервера.
; Пример пути, а не обязательный каталог установки
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 или проверки имени. Тогда исчезает гарантия, что данные получает нужный сервер. Исправляйте доверие или цепочку, а затем повторяйте запрос с включённой проверкой.

КОНЕЦ ЗАМЕТКИ↑ В начало