Ошибка "Could not connect to host" при интеграции с ГИС ЖКХ (Laravel 8, php 7)
Доброго времени суток!
Перед мной стоит задача настроить интеграцию с ГИС ЖКХ с помощью SOAP API. Я использую фреймворк Laravel 8 на php 7.
Для начала я хотел просто подключиться к серверу и получить от него ответ в виде ошибок авторизации или Bad Request 404.
Я нашел на офф сайте документацию API в форматах WSDL и XSD. Так как ссылки на WSDL нет, я предположил, что всю папку необходимо скопировать в проект и обращаться к локальному WSDL файлу на сервере.
$client = new SoapClient(realpath(storage_path($this->wsdl)));
return $client->exportDebtRequests([]);
При попытке отправки запроса в строке
return $client->exportDebtRequests([]);
Возникает ошибка "Could not connect to host".
К сожалению в открытом доступе мне удалось найти только один хороший пример на Yii (php), попытался реализовать подключение аналогичным образом, но это не помогло. Надеялся на то, что указание дополнительных полей в options и headers поможет, но я так понимаю, что дело вообще не в этом.
$wsdl = "gis_api/debt-requests/hcs-debt-requests-service-async.wsdl";
$location = "https://api.dom.gosuslugi.ru/ext-bus-debtreq-service/services/DebtRequestsAsync";
// $location = "https://sit01.dom.test.gosuslugi.ru:10081/ext-bus-debtreq-service/services/DebtRequestsAsync"; // тестовый location из документации
set_time_limit(0); // снятие ограничения по времени ожидания
$client = new SoapClient(
realpath(storage_path($this->wsdl)),
[ "wsdl" =>realpath(storage_path($this->wsdl)), // путь к wsdl
"username" => '******************',
"password" => '******************',
"location" => $this->location, // location сервера, который был взят из указанного wsdl файла
"sslKey" => realpath(storage_path('gis_api/cert.key')), // ssl ключ
"sslCert" => realpath(storage_path('gis_api/cert.pem')), // ssl сертификат
"caInfo" => realpath(storage_path($this->caInfo)), // путь к файлу Квалифицированного сертификата ключей проверки электронной подписи ИС
"debug_handle" => null,
"senderId" => "********-****-****-****-************", // Идентификатор поставщика данных
"orgPPAGUID" => "********-****-****-****-************" // Дата отправки пакета
]);
// объект $header содержит 5 полей в соответствии с документацией
$header = new RequestHeader(); // отдельный класс для заголовков
$header->IsOperatorSignature = true; // Используется подпись оператора ИС
$header->SenderID = '********-****-****-****-************'; // Идентификатор поставщика данных
$header->orgPPAGUID = '********-****-****-****-************'; // Идентификатор зарегистрированной организации
$header->MessageGUID = Helper::guid(); // Идентификатор сообщения
$header->Date = (new \DateTime())->format(\DateTime::ATOM); // Дата отправки пакета
$client->__setSoapHeaders(new \SoapHeader("http://dom.gosuslugi.ru/schema/integration/base/", 'RequestHeader', $header));
return $client->exportDebtRequests([]); // ошибка возникает именно в момент запроса
Подскажите, пожалуйста, в чем может быть проблема? Если кто-то уже интегрировался с ГИС ЖКХ, посмотрите, пожалуйста, правильно ли указаны wsdl и location?
Что интересно, если использовать тестовый location запрос проходит медленнее, но результат тот же, то есть какие-то попытки подключения все же происходят.
Раньше аналогичным образом подключались к РТС тендеру проблем не возникало. Только в случае с РТС передавали основную информацию в теле запроса.
Ответы (1 шт):
Проблема оказалась менее тривиальной, чем я описывал. В своем проекте, я скопировал все зависимости из "примера на Yii", включая конфигурации и тестовые ключи, и обратился к имеющемуся методу. Надеялся, что они будут работать, несмотря на то, что проект успел немного устареть.
Написанный там модуль действительно использовал гостовские алгоритмы шифрования, которые предоставляет библиотека для openssl, как и сказал Daniel Protopopov Однако, если верить одному из форумов этот способ устарел. Поэтому код из "примера" устарел, но все еще может пригодиться для формирования запросов.
В результате алгоритм отработал для этого использовался самописный класс LocalSopaClient из "примера" с openssl под капотом и выдал таймаут запроса.
Касательно защищенного соединения необходимо настраивать ГОСТ с TLS на nginx/Apahe. Есть пример настройки для nginx на офф. сайте КриптоПро. На данный момент я использую Apache, так что буду разбираться в ГОСТ с TLS на Apache или переносить проект на nginx.