ГИС ЖКХ. Отправка и подпись сообщений на PHP

Ранее была статья, с реализацией подписи на Python. Переписал всё то-же самое на PHP. Ну на тот случай, если вдруг какие-то нюансы упустил в реализации. Однако нет, ошибка та-же:

Ниже описываю как формирую запрос. Он собирается из нескольких файлов xml:

in.xml

req.xml — непосредственно запрос к ГИС ЖКХ. В данном случае получение списка запросов от сторонних организаций о задолженностях потребителей

xades.xml:

sp.xml:

si.xml:

Т.е. общий алгоритм следующий — заполняем в каждом файлике значения в фигурных скобках, а затем склеиваем всё в единый файл out.xml, который уже непосредственно отправляем по SOAP через туннель с ГИС ЖКХ.

Для начала понадобятся следующие функции:

Вычисление хэш строки по алгоритму ГОСТ Р 34.11-2012 256 бит:

Получается строка вида: JSO1ALXjmpWXGkdQAs4RcEroYUnXOdbp5j4tbG8bNN8= в формате base64

Получение эмитента сертификата:

Особенностью является «перевертывание» информации, нормализация отображения, а так-же замена ИНН, ОГРН и email на цифровые коды. Согласно рекомендации из «Альбом ТФФ». У меня получилась строка вида:

Получение серийного номера сертификата:

Согласно Альбому ТФФ, он должен быть в десятичном формате. Вида:

Канонинализация XML:

Для того чтобы в XML не было лишних и не значащих символов, данные перед подписанием и вычислением хэша необходимо канонинализировать:

Получение сертификата в формате Base64:

Получение подписи текста:

Возвращается в формате base64

Получение UUID:

Далее идет уже непосредственно уже вычисление необходимых блоков и формирование выходного файла:

Далее полученный файлик можно вставить например в SOAP UI, и попробовать отправить.

В ответ получим номер идентификатора запроса. Далее его используем в запросе getState.. И получаем ошибку которая в самом начале статьи. Что не так — пока не понятно.

Update: тут немножко не верная реализация подписи. Нужно подписывать хэш данных, а у меня подписываются данные. Но пока без разницы — ошибка так и осталась.

PHP и каноникализация C14N

Цель канонизации — обеспечить, чтобы для одних и тех же данных на уровне XML не менялся хэш, необходимый для проверки подписи.  Т.е. удаляются лишние пробелы, символы и т.д. У себя реализовал примерно так:

PHP Curl: Segmentation fault

Столкнулся со странной ошибкой на Astra Linux, а именно если вызывать:

То получаем ошибку:

Хотя в любом другом дистрибутиве получаю стандартное:

ошибка сегментирования

Начал рыть….долго и упорно… искал разницу между установленными версиями curl. И единственное что по большому счёту отличало версию Astra Linux — поддержка сертификатов шифрования ГОСТ. А сайт Госуслуг именно их и использует. Причем шифрование на этом сайте версии 1.3. А что если попробовать принудительно попросить curl именно это шифрование? И в правду заработало:

На PHP аналог выставления данного флага:

Хотя конечно остаются вопрос, почему просто падает не показывая почему..

PHP и его странная математика

Столкнулся с очень чудесной ошибкой на PHP:

Что вы ожидаете увидеть в выводе? 115? А вот и нет. Если echo выведет 115, то var_dump выведет 114.99999

Что не так с float?

Тип float в языке PHP, как и его “родственник” тип double, вовсе не предназначен для точного представления десятичных дробей. Всё что мы записали в float, хранится в приближенном значении, с некоторой погрешностью.

Решение: в виду того что в PHP это считается фичей, а не багом, то для точной работы с математикой нужно использовать модуль bcmath. Ну или использовать округления до нужной точности

P.S. Не первый раз уже вспотыкаюсь об это

Таблица в массив на php

Задача: Есть некая очень захламленная сторонними элементами страница в разметке html. Необходимо преобразовать находящуюся на ней таблица в массив данных.

Решение: сначала вычленим «грязное» содержимое таблицы между тегами <tbody></tbody>, затем преобразуем его в DOM документ, а далее уже распарсим его обходами и разложим элементы в массив.

Получилось что-то вроде:

1 2 3 4 23