При использовании 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 инициализируется без ошибок.