PHP, libCURL, cURL и OpenSSL сертификаты

При использовании SoapClient работающего по HTTPS возникла проблема в том что не удавалось загрузить WSDL и инициализировать клиент.
Причем через браузер файл WSDL отдается нормально — только с предупреждением о невалидном сертификате. Оказалось что разработчики сервера не стали заморачиваться с сертификатами и просто подписали его самостоятельно.

Как показало небольшое расследование SoapClient в PHP использует libcurl для работы с HTTPS. А cURL в свою очередь видит невалидный сертификат и отказывается качать файл.
Можно очень просто научить cURL игнорировать валидность сертификата. Но как сделать это через SoapClient я не нашел.

Попросить сервер отдавать валидный сертификат так же невозможно. Впрочем как и убрать поддержку cURL из текущей сборки PHP.

Остается один путь — научить локальный cURL в этой связке воспринимать имеющийся сертификат как валидный.

В наличии есть .PEM файл сертификата от сервера, с которым мы хотим работать.
Файл вот такой структуры:
——BEGIN CERTIFICATE——
MIICBjCCAXOgAwIBAgIQjt6Z0hvb75VOC3kTqOvgnzAJBgUrDgMCHQUAMBwxGjAY
….
cbGwwWhHr0pDHzh5oOt8+LeddRaPaxAYuN06m9/tBPiEyLg7g61nYcXE
——END CERTIFICATE——

Решение заключается в том чтобы добавить этот PEM файл в ca-bundle.crt который использует cURL

1. Узнаем файл .crt который использует cURL:

curl-config --ca

В результате получаем полный путь до нужного файла: ca-bundle.crt

2. Добавляем в этот файл информацию о сертификате:

openssl x509 -in cert.pem -text -noout >> ca-bundle.crt

3. Добавляем собственно сам сертификат

openssl x509 -in cert.pem >> ca-boundle.crt

Проверяем что все получилось: curl
Если все сделали правильно и использововали нужный ключ, то cURL должен скачать файл без лишних вопросов.
Соответственно и SoapClient инициализируется без ошибок.

Запись опубликована в рубрике Работа с метками , , , . Добавьте в закладки постоянную ссылку.

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