Сброс пароля Bitrix

Для того чтобы сбросить пароль у известного пользователя и известным ID, достаточно в корне сайта разместить файл:

r.php

Вместо 111 — вставить ID пользователя из БД. Вместо 123 — свой пароль. Далее открыть этот файл через браузер. После смены пароля естественно файл нужно удалить

ГИС ЖКХ — отправка и подпись запросов часть 3

В продолжение предыдущей статьи. На основе того кода, так и не удалось довести до рабочего состояния. Ошибка так и осталась. Посему было решено..опять всё переписать с нуля.. С учётом полученных новых вводных, а именно:

  • XML подписи оказывается должен быть минимизирован (не должно быть форматирования тегов)
  • подписываться должен хэш данных, а не сами данные
  • при работе с XML как текстом, были опасения про неверную каннизацию

Потому переписал код на отностительно честную работу с XML через DOMDocument. С одним нюансом — так и не научился вставлять один XML документ в другой посредством его. Поэтому присутствует трюк с переводом XML в текст, склейкой двух XML и обратный перевод в DOMDocument. XML шаблоны удалось сократить до двух:

fish.xml:

xades_dom.xml:

И сам код скрипта:

Но увы и ах.. Результат его работы хоть с виду еще более нормальный, но ГИС ЖКХ так и продолжает возвращать ошибку:

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

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

Ранее уже описывал как поднять защищенный туннель с ГИС ЖКХ.Теперь настало время научится делать запросы. Для этого их необходимо подписывать. Подписывается тело сообщения 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:

1 2 3 300