Замена PHP Curl на Wget

Так получилось, что иногда пишу парсеры сайтов на PHP. Использую обычный PHP Curl, густо обмазанный различными вспомогательными классами. Всё было хорошо, но однажды один из скриптов перестал работать. Стал разбираться почему — PHP стал падать с ошибкой сегментирования (segmentation fault) при вызове:

Стал разбираться. Выяснил что перестаёт падать после комментирования строчки:

Явно что-то не так с шифрованием. Вспомнил даже, что нечто подобное уже было. Проверил — точно сайт стал шифроваться по протоколу ГОСТ:

И собственно в тот раз проблема решилась а в этот раз таки уже нет. Когда попробовал добавить ключ с указанием версии шифрования, скрипт стал бесконечно висеть.

И из консоли в том числе:

Ну ладно. Пойдем другим путём. Проверив как открывается этот-же сайт при помощи wget, и убедившись, что с ним всё хорошо, понял что при помощи его работа в принципе будет даже проще. Всё свелось к комбинации сточек вида (конкретно тут для примера без обработки ошибок):

Javascript: удаление элемента массива

В JavaScript как мне кажется не очень удобная реализация работы с массива. Наверное слишком низкоуровневая по сравнению с другими интерпретируемыми языками программирования. Возможно это даёт большую гибкость, но лично мне не удобно, что для простое удаление элемента массива по виду:

Приводит на самом деле не к удалению элемента массива, а пометке, что элемент пустой. Многие пользуются командой splice:

Или даже filter:

Но как говорится «Мне не зашло» (c), ибо есть с чем сравнивать удобство (Python, PHP и т.д.)

ГИС ЖКХ. Отправка и подпись сообщений на 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: тут немножко не верная реализация подписи. Нужно подписывать хэш данных, а у меня подписываются данные. Но пока без разницы — ошибка так и осталась.

ГИС ЖКХ — подпись сообщений

Ранее уже описывал как поднять защищенный туннель с ГИС ЖКХ.Теперь настало время научится делать запросы. Для этого их необходимо подписывать. Подписывается тело сообщения XML заключенное внутри тега body:

Сохраню его в файл in.xml. Далее для работы понадобится сертификат в формате x.509, он выгружается в формате BASE64 из Крипто-про

Понадобится он в бинарном виде:

Далее собираем следующую рыбу:

digest1 считается как хеш-сумма по ГОСТу и выводится в виде BASE64 содержимым тега body (см. выше)

digest2 считается как хэш-сумма бинарного файла сертификата x509 и преобразованное в base64:

cat 509.bin | openssl dgst -engine gost -md_gost94  -binary | base64 >digest2

Далее заполняем блок SignedProperties, а в частности поля x509_issuer_name и x509_sn. Их можно получить соответственно командами:

Причем x509_issuer_name нужно привести к виду:

cn=Тестовый УЦ ООО \»КРИПТО-ПРО\»,o=ООО \»КРИПТО-ПРО\»,l=Москва,st=г. Москва,c=RU,street=ул. Сущёвский вал д.18,1.2.643.3.131.1.1=001234567890,1.2.643.100.1=1234567890123

Тег emailaddress, заменяется на 1.2.840.113549.1.9.1, inn на 1.2.643.100.4, а ogrn на 13 1.2.643.100.1

Теперь необходимо подписать то, что мы заполнили между тегами SignedInfo. У меня получилось что-то вроде:

Подпись осуществляется так:

openssl dgst -sign key.key -out to_sign.sig -binary to_sign

Подпись сохранилась в файл to_sign.sig, помещаем содержимое внутри тега SignatureValue и получившийся таким образом файл пробуем отправить в ГИС ЖКХ.


Некоторые заметки:

1) Как вытащить закрытый ключ с флешки с подписью — нужно воспользоваться утилитой P12FromGostCSP. Если вы пользовались чем-то другим, то с большой долей вероятностью получите ошибку:

2) Формировать подпись или через КриптоПро или через OpenSSL.

3) Есть готовая утилита для формирования шапки с подписью написанная на Python 2.7. Я её перевел на Python3, сделав минимальные косметические изменения. В принципе работает. Скачать тут

Update 16.06.2025: на текущий момент не удалось достичь успешной отправки запроса в ГИС ЖКХ. Ошибка:

Подпись не подходит ни крипто-про:

Ни OpenSSL:

Mozilla Thunderbird и Exchange

Штатно этот почтовый клиент не поддерживает работу с этим сервисом. Что чрезвычайно странно. Возможно как-то связано как обычно с политикой Microsoft. Для того чтобы научить работать Thunderbird c Exchange необходимо воспользоваться расширениями. Коих ровно два. Которые по сути один с разными названиями. Которые платные. Которые оплатить нельзя потому что потому. Пришлось стать «благородным пиратом», потому что я не согласен с дискриминацией по национальной принадлежности. Ниже ссылка на «взломанную» версию данного плагина:

P.S. Как только появится возможность купить данное расширение, файл незамедлительно уберу, и расширение куплю.

Считаете ли вы этичным пользоваться взломанным ПО при отсутствии возможности приобрести лицензионное ПО из-за дискриминации по национальному признаку (санкции)

View Results

Загрузка ... Загрузка ...
1 2 3 70