В данном документе описывается сервис, реализующий взаимодействие с Модулем сбора данных Подсистемы учета и отчетности Государственной интегрированной информационной системы управления общественными финансами «Электронный бюджет» (далее – МСД ПУиО) в целях создания единого информационного пространства и обеспечения доступа к объектам технологической интеграции в режиме реального времени.
Под фоновым пользователем понимается пользователь базы данных, от имени и с правами которого работают внешние фоновые задания, в т.ч. сервисы.
Для его создания необходимо:
Создать пользователя БД:
PostgreSQL
>psql -h 127.0.0.1 -d demo -U postgres
CREATE ROLE parus_srv LOGIN PASSWORD 'parusina' INHERIT;
GRANT parus_public TO parus_srv;
ALTER ROLE parus_srv IN DATABASE demo SET search_path = parus, sys;
Oracle
>sqlplus parus/passwd@ORCL1
create user PARUS_SRV identified by parus_srv default tablespace PARUS_MAIN temporary tablespace TEMP;
grant CREATE SESSION to PARUS_SRV;
Приложение "Администратор" ⇒ Раздел "Пользователи" ⇒ зарегистрировать пользователя с установленным флажком "Фоновый пользователь".
Связать пользователя (роль) с приложением "Онлайн доступ".
Связать пользователя с организацией, назначить все права в разделе "Журнал взаимодействия с МСД".
Файл ⇒ Сервис ⇒ Параметры ⇒ каталог «Таксономия. Журнал взаимодействия с МСД».
Параметр № 2314 TaxonomyJournal_TargetSystemID отражает значение идентификатора ЕСМВ. Для продуктивного контура всегда должно быть указано значение по умолчанию «MSD».
Для работы с сервисом пользователь ПП "ПАРУС-Бюджет 8" или назначенная ему роль должны иметь соответствующие права в разделе "Журнал взаимодействия с МСД" приложения "Таксономия".
Также с контрагентом юридического лица в разделе «Сертификаты контрагентов» должен быть увязан соответствующий «транспортный» сертификат. Для осуществления данной привязки сертификат предварительно должен быть загружен в раздел «Электронные сертификаты». Дополнительно см. главу "Получение сертификатов".


Для авторизации в МСД ПУиО при помощи сервисного взаимодействия через ЕСМВ необходимо использовать т.н. мнемонику учреждения – уникальное имя информационной системы, присвоенное при ее регистрации в ПОИБ согласно рекомендациям Федерального Казначейства. Например, оно может быть составлено путем конкатенации имени информационной системы (PARUS), а также ИНН и КПП учреждения.
Для указания его значения сначала необходимо создать текстовое дополнительное свойство с мнемокодом "ТаксономияМнемоИС" и наименованием "Таксономия. Мнемоника ИС субъекта интеграции", привязанное к разделу "Юридические лица":

Затем для записи юридического лица-субъекта передачи данных в МСД ПУиО необходимо указать в данном дополнительном свойстве значение мнемоники учреждения в МСД ПУиО:

На серверах, где будут установлены сервисы Шина сообщений (EmbWebProxy) и Таксономия (MqTaxonomyService), требуется установить .NET Core 8.0 (рекомендуется установка SDK на Linux, Hosting Bundle - на Windows). См. "Установка .NET в Windows, Linux" или главу ".NET Core" инструкции "Парус-Онлайн 2. Часть 4. Дополнения.docx".
Для работы сервиса Шина сообщений (EmbWebProxy) требуется развёртывание брокера сообщений (RabbitMQ или Apache Kafka+ZooKeeper).
Установку см. на сайтах разработчиков (RabbitMQ или Kafka) или главу "Программный брокер сообщений" инструкции "Парус-Онлайн 2. Часть 4. Дополнения.docx".
Настройка RabbitMQ для работы с сервисами ПП "ПАРУС-Бюджет 8":
rabbitmqctl add_vhost parus_mq
rabbitmqctl add_user parus parusina
rabbitmqctl set_permissions -p parus_mq parus ".*" ".*" ".*"
Установка и настройка Шины сообщений (EmbWebProxy):
# создание пользователя (опция)
useradd dotnet -m
passwd dotnet
su - dotnet
unzip /tmp/extra.zip *EmbWebProxy* -d ~/
nano ~/extra/EmbWebProxy/appsettings.json
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://*:5121"
…
"AllowedHosts": "*"
Настройка встроенного веб-сервера: протокол, интерфейсы и порт для прослушивания
Настройка взаимодействия с брокером сообщений Apache Kafka или RabbitMQ
"MessageBus.Common": {
"Type": "Kafka"
},
"MessageBus.Kafka.Producer": {
"Producer": {
"bootstrap.servers": "localhost:9092",
"client.id": "EmbWebProxy",
"acks": "1",
"message.timeout.ms": "5000"
}
},
"MessageBus.Common": {
"Type": "RabbitMq"
},
"MessageBus.Rabbit.Producer": {
"ConnectionString": "host=localhost;virtualHost=parushost;username=parus;
password=parusina;publisherConfirms=true;timeout=10"
},
"Logging": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Information"
…
Настройка протоколирования
LogLevel - минимальный уровень журнала
Запуск Шины сообщений вручную (проверка):
cd ~/extra/EmbWebProxy
dotnet EmbWebProxy.dll
# Для остановки - комбинация клавиш "Ctrl + C"
Запуск Шины сообщений как службы (systemd unit):
nano /etc/systemd/system/EmbWebProxy.service
[Unit]
Description=EmbWebProxy
After=network.target
Requires=network.target
[Service]
Type=simple
User=dotnet
ExecStart=dotnet /home/dotnet/extra/EmbWebProxy/EmbWebProxy.dll
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
KillMode=mixed
KillSignal=SIGINT
Restart=always
RestartSec=10
SyslogIdentifier=EmbWebProxy
WorkingDirectory=/home/dotnet/extra/EmbWebProxy
[Install]
WantedBy=multi-user.target
Настроить взаимодействие базы данных с Шиной сообщений (если это не было сделано ранее для других сервисов). Для задания адреса шины используется настройка № 1757 "Адрес шины сообщений" (EMBProxyAddress), например, http://127.0.0.1:5121/api/Mq
Проверить доступность шины с сервера, где будет установлен сервис MqTaxonomyService (в браузере или с помощью утилиты curl: curl http://<адрес>:5121/api/mq).
Проверить доступность шины с сервера БД:
PostgreSQL
>psql -h 127.0.0.1 -d demo -U parus
select PKG_MQ_INT$SEND('http://<адрес>:5121/api/Mq', 'POST', 'application/json', '{"topic":"Topic","message":"Message"}');
Oracle
>sqlplus parus/passwd@ORCL1
execute PKG_MQ_INT.SEND('http://<адрес>:5121/api/Mq', 'POST', 'application/json', '{"topic":"Topic","message":"Message"}');
Подробнее см. главу "Шина сообщений (EmbWebProxy)" инструкции "Парус-Онлайн 2. Часть 4. Дополнения".
Получить сертификаты для взаимодействия с МСД ПУиО.
В качестве т.н. «транспортного» должен быть задействован тот сертификат, который использовался при регистрации информационной системы учреждения в ПОИБ. При этом если к моменту настройки сервиса срок действия данного сертификата истек, то необходимо предварительно перерегистрировать в ПОИБ обновленный сертификат, выпущенный взамен истекшего.
Клиентский (т.н. «транспортный») сертификат будет использован:
Если Stunnel и MqTaxonomyService будут размещаться на разных серверах, то необходимо установить сертификат на обоих.
Для соединения с сервисом взаимодействия с МСД ПУиО по https с ГОСТ TLS необходимо установить и настроить КриптоПРО Stunnel c аутентификацией клиентов по сертификату. Порядок установки и проверки работы см. сайт КриптоПРО и инструкцию “Парус-Онлайн 2. Часть 6. КриптоПРО Stunnel”.
Установить полученные сертификаты для пользователя, от имени которого будет запускаться Stunnel.
Например, имеется пользовательский сертификат clientcert.pfx и сертификаты УЦ (root.cer, ca.cer или одним файлом, тогда при установке нужный сертификат выбирается по номеру).
sudo /opt/cprocsp/bin/amd64/certmgr -inst -file ~/root.cer -store mRoot
sudo /opt/cprocsp/bin/amd64/certmgr -inst -file ~/ca.cer -store mCA
Установка корневых/промежуточных сертификатов (в хранилище компьютера). Если доступен графический интерфейс, то можно выполнить установку с помощью приложения "Инструменты КриптоПро" (Сертификаты ⇒ Установить сертификаты)
su - dotnet
Залогиниться под пользователем, от имени которого будет запускаться Stunnel
/opt/cprocsp/bin/amd64/certmgr -install -pfx -pin '' -file clientcert.pfx -store uMy
Установить пользовательский сертификат в хранилище пользователя.
/opt/cprocsp/bin/amd64/certmgr -list -thumbprint 9e5b07912... -store uMy
Проверить сертификат
/opt/cprocsp/bin/amd64/certmgr -export -store uMy -thumbprint 9e5b07912... -dest auth.cer
Выгрузить сертификат (без ключа) в формате DER (или "Инструменты КриптоПро" ⇒ Сертификаты ⇒ Экспортировать сертификаты - X.509 в DER)
sudo cp auth.cer /etc/stunnel/
Переместить файл сертификата (в доступное для чтения пользователем место)
Примечание. Сертификаты УЦ могут быть уже установлены, например, вместе с ОС или КриптоПро. Для проверки используйте утилиту "Инструменты КриптоПро" (Сертификаты - Доверенные корневые сертификаты) или команду
/opt/cprocsp/bin/amd64/certmgr -list -dn 'CN=Минцифры России' -store mRoot
Создать конфигурационный файл КриптоПРО Stunnel (stunnel.conf, размещение произвольное, доступное пользователю, от имени которого выполняется Stunnel):
~/stunnel.conf
pid=/tmp/stunnel.pid
output=/tmp/stunnel.log
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
;foreground = yes
[testTaxonomy]
client=yes
accept=127.0.0.1:1559
connect=gateway.roskazna.ru:443
verify=0
cert=/home/dotnet/auth.cer
| Параметр | Описание |
|---|---|
pid=/tmp/stunnel.pid | Файл идентификатора процесса (только Linux) |
output=/tmp/stunnel.log | Файл протокола работы |
| (отсутствует) | Пользователь, от имени которого работает сервис, должен иметь права на запись/создание файлов |
socket = l:TCP_NODELAY=1 | Опции локального сокета приёма соединений |
socket = r:TCP_NODELAY=1 | Опции удалённого сокета приёма соединений |
debug = 7 | Не изменять Уровень протоколирования сообщений. |
;foreground = yes | Консольный режим работы приложения, для удобства при запуске вручную |
[testTaxonomy] | Секция подключения к сервису |
client=yes | Включение режима клиента |
accept=127.0.0.1:1559 | Принимать клиентские подключения на host:port 127.0.0.1 - только локальные подключения 172.28.50.2 - только на конкретном интерфейсе (в том числе и с других компьютеров) 0.0.0.0 - на всех интерфейсах IPv4 |
connect=gateway.roskazna.ru:443 | Адрес удалённого сервера |
verify=0 | Уровень проверки сертификата удалённого сервера. |
cert=/home/dotnet/auth.cer | Клиентский сертификат в der-кодировке для аутентификации. Соответствующий сертификат в хранилище КриптоПро должен иметь ссылку на закрытый ключ. |
Примечание. Размещение конфигурационного файла в Linux произвольное, в Windows - обязательно %SYSTEMROOT%\system32\stunnel.conf
Проверка работы туннеля
su - dotnet
/opt/cprocsp/sbin/amd64/stunnel_thread ~/stunnel.conf
Запуск туннеля вручную, для окончания работы нажать Ctrl+C (при настройке foreground=yes)
tail /tmp/stunnel.log -f -n 20
Просмотр лога в режиме реального времени
curl http://127.0.0.1:1559
Проверка работы
Создание сервиса для автоматизации запуска
sudo nano /etc/systemd/system/cspstunnel.service
[Unit]
Description=CryptoPro SSL Tunnel
After=network.target
[Service]
Type=forking
User=dotnet
ExecStart=/opt/cprocsp/sbin/amd64/stunnel_thread /home/dotnet/stunnel.conf
ExecReload=/usr/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
WorkingDirectory=/home/dotnet
[Install]
WantedBy=multi-user.target
Управление сервисом
sudo systemctl start cspstunnel
sudo systemctl stop cspstunnel
sudo systemctl status cspstunnel
sudo journalctl -u cspstunnel -f -n 20
tail -f -n 20 /tmp/stunnel.log
# создание пользователя (опция)
useradd dotnet -m
passwd dotnet
Установить КриптоПро CSP, сертификаты пользователя и УЦ (если не были установлены ранее, например, для Stunnel) для пользователя, от имени которого будет запускаться сервис MqTaxonomyService.
Примечание. Сертификат пользователя можно установить в хранилище LocalMachine/Личное (mMy), тогда его не нужно будет задавать в настройке appsettings.json - "SoapClient": "Security": "SigningCertificate" (он ищется в этом хранилище по умолчанию по отпечатку, указанному в настройках ПП "ПАРУС-Бюджет 8" как сертификат контрагента).
Например, имеется пользовательский сертификат clientcert.pfx и сертификаты УЦ (root.cer, ca.cer или одним файлом, тогда при установке нужный сертификат выбирается по номеру).
sudo /opt/cprocsp/bin/amd64/certmgr -inst -file ~/root.cer -store mRoot
sudo /opt/cprocsp/bin/amd64/certmgr -inst -file ~/ca.cer -store mCA
Установка корневых/промежуточных сертификатов (в хранилище компьютера). Если доступен графический интерфейс, то можно выполнить установку с помощью приложения "Инструменты КриптоПро" (Сертификаты – Установить сертификаты)
sudo -u dotnet /opt/cprocsp/bin/amd64/certmgr -install -pfx -pin '' -file clientcert.pfx -store uMy
# или
sudo /opt/cprocsp/bin/amd64/certmgr -install -pfx -pin '' -file clientcert.pfx -store mMy
Установить пользовательский сертификат в хранилище пользователя или LocalMachine/Личное (без пароля)
sudo -u dotnet /opt/cprocsp/bin/amd64/certmgr -list -thumbprint 9e5b07912... -store uMy
# или
sudo -u dotnet /opt/cprocsp/bin/amd64/certmgr -list -thumbprint 9e5b07912... -store mMy
Проверить сертификат
su - dotnet
# распаковка файлов сервиса из архива
unzip /tmp/extra.zip *MqTaxonomyService* -d ~/
# символические ссылки на библиотеки КриптоПро
ln -s /opt/cprocsp/lib/amd64/libcapi20.so.4 ~/extra/MqTaxonomyService/advapi32.dll
ln -s /opt/cprocsp/lib/amd64/libcapi20.so.4 ~/extra/MqTaxonomyService/crypt32.dll
ln -s /opt/cprocsp/lib/amd64/libcapi10.so.4 ~/extra/MqTaxonomyService/kernel32.dll
nano ~/extra/MqTaxonomyService/appsettings.json
| Параметр конфигурации | Описание |
|---|---|
"TaxonomyHandlerService": { "Topic": "TAXONOMY" }, | Служебная информация (для работы с шиной EmbWebProxy). Не изменять. |
"Connection": { "Kind": "postgre", "ConnectionString": "host=127.0.0.1;port=5432;database=demo;user id=parus_srv;password=parus_srv;unicode=true;pooling=false;Default Command Timeout=0", "DbMonitorEnabled": false },"Connection": { "Kind": "oracle", "ConnectionString": "direct=true;host=172.28.31.178;port=1521;service name=META;user=PARUS_SRV;password=PARUS_SRV;pooling=false;Run Once Command=ALTER SESSION SET CURRENT_SCHEMA = PARUS", "DbMonitorEnabled": false }, | Описание соединения с БД (PostgreSQL или Oracle) |
"DbConnectionHolder": { "RestoreTryCount": 10, "RestoreAwaitTimeout": "0.00:00:05"}, | Настройка восстановления соединения с БД в случае его потери (например, при перезапуске сервера БД) - количество попыток и интервал между ними |
"MessageBus.Common": { "Type": "Kafka" },"MessageBus.Kafka.Producer": { "Producer": { "bootstrap.servers": "localhost:9092", "client.id": "EmbWebProxy", "acks": "1", "message.timeout.ms": "5000" } },"MessageBus.Common": { "Type": "RabbitMq" },"MessageBus.Rabbit.Producer": { "ConnectionString": "host=localhost;virtualHost=parushost;username=parus;password=parusina;publisherConfirms=true;timeout=10" }, | Настройка взаимодействия с брокером сообщений Apache Kafka или RabbitMQ |
"SoapClient": { "Transport": { "Url": "http://127.0.0.1:1559", "RequestTimeout": "0.00:00:30", "CustomHeaders": { "Host": "gateway-test.roskazna.ru" }, "Log":{ "Enabled" : true } }, | Адрес соединения “КриптоПро Stunnel”, настроенного на соединение с сервисом МСД ПУиО См. главу "Настройка КриптоПро Stunnel" Сервер бизнес-функционала (тестовый). Продуктивный сервер - gateway.roskazna.ru Протоколирование событий (кроме скачивания вложений) в «Журнале регистрации взаимодействия веб-служб» (таблица WEBSRVHST) |
"Security": { "SignRequest": true, "ValidateSignedRequest": true, "ValidateResponseSign": false, "SigningCertificate": { "Store": "CurrentUser", "FindKind": "Thumbprint", "Pattern": "ea9bea6d2e9b2b........", "Password": "......" }, "EncryptRequest": false, "EncryptingCertificate": null }, | Настройки безопасности соединения с сервисом МСД ПУиО - Сертификат серверной подписи (с параметрами поиска - хранилище, признак и значение для поиска, пароль контейнера если есть). Если сертификат установлен без пароля в хранилище mMy, то можно не указывать. Необходимо использовать т.н. «транспортный» сертификат (см. Получение сертификатов) |
"Logging": { "IncludeScopes": true, "LogLevel": { "Default": "Information" } }, | Настройка протоколирования LogLevel - минимальный уровень журнала |
"ClientCertificates": { "ea9bea6d2e9b2bce9becdc7a4.....": { "Store": "CurrentUser", "Password": "1" } }, | Перечисление сертификатов юридических лиц для поиска на сервере, если они не передаются с клиентского рабочего места. Обычно не используется. |
"ServiceExchangeLogger": { "Enabled": true, "Connection": { "Kind": "oracle", "ConnectionString": "direct=true;host=Parus8ora10;port=1521;service name=META85;user=PARUS_SRV;password=PARUS_SRV;pooling=false;Run Once Command=ALTER SESSION SET CURRENT_SCHEMA = PARUS", "DbMonitorEnabled": false } | Не используется. См. "SoapClient":"Log":"Enabled" |
Запуск сервиса вручную (проверка):
cd ~/extra/EmbWebProxy
dotnet EmbWebProxy.dll
# Для остановки - комбинация клавиш "Ctrl + C"
Автоматизация запуска с помощью менеджера служб systemd (Linux)
Создание unit-файла
sudo nano /etc/systemd/system/MqTaxonomyService.service
[Unit]
Description=MqDocumentSigner
After=network.target
Requires=network.target
[Service]
Type=simple
User=dotnet
ExecStart=/home/dotnet/.dotnet/dotnet /home/dotnet/extra/MqTaxonomyService/MqTaxonomyService .dll'
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
KillMode=mixed
KillSignal=SIGINT
Restart=always
RestartSec=10
SyslogIdentifier=MqTaxonomyService
WorkingDirectory=/home/dotnet/extra/MqTaxonomyService
[Install]
WantedBy=multi-user.target
Примечание. Если сервис работает на одном сервере с другими компонентами, то рекомендуется добавить их в параметры "After" и "Requires", например,
After=EmbWebProxy.service cspstunnel.service postgresql.service
Работа с сервисом
sudo systemctl enable MqTaxonomyService
sudo systemctl start MqTaxonomyService
sudo systemctl stop MqTaxonomyService
sudo systemctl status MqTaxonomyService
sudo journalctl -u MqTaxonomyService -f -n 20
Для работы с сервисом используются разделы "Периоды предоставления данных" и "Журнал взаимодействия с МСД" приложения "Таксономия".
В разделе "Периоды предоставления данных", вызываемом через главное меню "Учет", необходимо выполнить действие "Создать запрос на отправку данных":

В результате будет сформирована запись Журнала с привязанным к ней пакетом данных.
Затем в разделе "Журнал взаимодействия с МСД", вызываемом через главное меню "Функции", необходимо найти сформированную запись и выполнить по ней действие "Подписать" с указанием в его параметрах сертификата, используемого для подписания пакета данных (например, сертификата главного бухгалтера, подтверждающего достоверность передаваемых данных):

Действие "Подписать" может быть выполнено многократно. При его выполнении для каждого xml-файла внутри сформированного пакета данных осуществляется формирование отдельного файла отсоединенной электронной подписи согласно сертификату, выбранному в параметрах вызова действия. Информация об электронных подписях, наложенных на пакет данных, отображается в спецификации "Электронные подписи" раздела "Журнал взаимодействия с МСД".
После этого необходимо выполнить действие "Отправить":

Для получения ответов от сервиса МСД ПУиО необходимо по найденной записи Журнала выполнить действие "Получить". Действие "Получить" доступно для многократного вызова и запрашивает из очереди сервиса всю информацию по отправленному пакету данных, доступную на момент вызова. В зависимости от промежутка времени между отправкой запроса на передачу данных и вызовом действия "Получить" могут быть последовательно получены квитанция ЕСМВ, квитанция МСД, а также получено или обновлено значение статуса отправленного запроса на передачу данных.
Также при получении информации об успешной обработке сервисом МСД ПУиО отправленного пакета данных на соответствующей записи Журнала станет возможным вызвать действие "Выгрузить протокол", которое отображает полученный от сервиса протокол с ошибками и предупреждениями в xml-формате.

При получении от сервиса МСД ПУио информации об отказе в принятии отправленного пакета данных соответствующая информация, возвращенная сервисом, будет отражена в колонке "Сообщение об ошибке".