Проблемы сдачи отчетности в электронном виде из 1С 8.3 в GNU\Linux

Здравствуй Гиктаймс, сегодня мы поговорим о некоторых, а по сути — одной большой, проблемах сдачи электронной отчетности в системе GNU\Linux.


image

Вопрос сдачи электронной отчетности из ОС Linux давно обсуждался как на Хабре/Гиктаймс, так и на тематических форумах — Мисте, Убунту, ЛОРе, КриптоПро и форуме техподдержки 1С: ИТС. В двух словах на настоящий момент есть два решения — либо использовать облачную КЭП и сдавать отчетность через обозреватель, либо использовать выделенную/виртуальную машину с установленной ОС Windows (пусть даже пробной версией) для сдачи отчетности. Вариант сдачи отчетности с помощью специализированных утилит предоставляемых органами (ФНС, ПФР, ФСС, Росстат, ФСРАР) возможен только при использовании Wine@Etersoft, что фактически тоже костыль (ибо нам потребуется ДВЕ лицензии на СКЗИ КриптоПро — для Windows и Linux).

Не секрет что для ОС GNU\Linux существует не так уж и много программ, для ведения бухгалтерии: Ананас (который ныне покоится с миром), украинский Дебет+ (у которого модуль поддержки Российского законодательства не обновлялся уже, Ктулу знает сколько) и 1С бухгалтерия. Имеются в виду Нативные приложения. Из всех вышеперечисленных только 1С на момент написания статьи входит в государственный реестр отечественного ПО и содержит механизмы подготовки и сдачи отчетности в электронном виде через спец-операторов электронного документооборота. К слову операторов, поддерживаемых 1С бухгалтерией не много: ЗАО «Калуга-Астрал» (разработчик подсистемы 1С-Отчетность), ООО «Такском», ООО НПФ «Форус» и мифический «Прочий оператор документооборота».
К сожалению сдача отчетности из 1С сопряжена с рядом трудностей, с которыми может столкнуться рядовой (да и опытный) системный администратор. Разумеется мы подробно рассмотрим эти проблемы и способы их решения.

Первая проблема с которой мы сталкиваемся — это СКЗИ. Нет, не их отсутствие, они есть. Для Linux есть несколько сертифицированных СКЗИ (с поддержкой ГОСТ) доступных к установке и используемых в разных подсистемах. На момент написания статьи это следующие СКЗИ, поправьте меня, если я что-то упустил:


  • CryptoCom
    Данная СКЗИ доступна для платформ i686 и amd64, используется в основном в системах интернет-банкинга, в частности системой iBank (используется многими банками, такими как ГазпромБанк, УБРИР, Альфа и д.р.).


  • Lissi CSP
    Одна из существующих СКЗИ предоставляющая помимо непосредственно, СКЗИ, версии обозревателя Mozilla Firefox и почтового клиента Mozilla Thunderbird с поддержкой алгоритмов шифрования и электронной-цифровой подписи семейства ГОСТ. К сожаления поддерживает только платформу i686, с драйвером ruToken совместимость СКЗИ проверить не удалось, хотя производитель её заявляет. Впрочем, расширение для продуктов Mozilla исправно видит сертификаты и позволяет производить подпись, шифрование и двустороннюю аутентификацию HTTPS с использованием алгоритмов ГОСТ. Совместимость с 1С мной не тестировалась.

Тем не менее продукт весьма достойный, если Вы пользуетесь 32х разрядной версией системы. Стоит помнить, что в этом случае ни одно приложение не сможет выделить больше 3 ГБ памяти на один процесс. Некоторые приложения, такие как СУБД, могут обходиться трюком с shmem и использовать до 64х ГБ памяти за счет выделения одного процесса на каждую сессию, но 1С бухгалтерия не использует такой технологии и сервер на 32х разрядную архитектуру с этим СКЗИ я бы ставить не советовал.


  • CryptoPro CSP
    Фактически единственное на настоящий момент комплексное решение для Linux для работы с электронной подписью и шифрованием. Доступна для платформ i686, amd64, armhf (включая android), PowerPC. Это не говоря уже о том что у них есть версии для Solaris (i686, amd64, sparc), AIX, FreeBSD, OSX и iOS. Как ни странно (сарказм), именно КриптоПро официально рекомендуется многими органами государственной власти для взаимодействия и электронного документооборота. Лицензии на КриптоПро часто идут в составе ключа ЭЦП, и в составе договора комплексного обслуживания для сдачи отчетности. Мой выбор был однозначным в пользу этого СКЗИ. К минусам можно отнести относительную сложность установки на системах отличных от RHEL/SLES и встречающиеся недочеты в сборке пакетов ПО (не разрешенные импортируемые символы и экспортируемые функции с разорванными зависимостями). В большинстве случаев эти недочеты не видны пользователю, т.к. данные функции предназначены для работы различных библиотек в составе КриптоПро и автоматически разрешаются при их первом вызове ядром ОС (в адресном пространстве приложения уже загружены нужные библиотеки). Второй минус — отсутствие почтового клиента, если обозреватель CryptoFox представлен, но от поддержки Thunderbird в КриптоПро отказались. Нужно отдать должное, что с их стороны предпринимались активные попытки внести изменения в рабочую версию NSS с целью поддержки ГОСТ, но воз и ныне там. Если бы изменения были приняты, поддержка ГОСТ появилась бы во всех обозревателях и приложениях использующих NSS, таких как Open\LibreOffice, продуктах Mozilla, Nautilus\Nemo, Thunar, XCA и других программах.


  • VipNet
    Ещё одна сертифицированная СКЗИ, поддержка которой изначально присутствует в 1С. Существует в виде бета-версии для архитектур i686 и amd64. К сожалению, кроме самого СКЗИ больше никаких продуктов для Linux у них нет и полноценная работа на порталах и торговых площадках с ней невозможна.

По понятным причинам был выбран СКЗИ КриптоПро, и давайте остановимся на нем подробнее.

Во-первых, для платформы Linux отсутствует знакомое многим приложение КриптоАРМ, для подписи документов. Впрочем для создания прикрепленной и открепленной подписи можно воспользоваться утилитами командной строки. Для создания и проверки открепленной цифровой подписи мной были созданы два сценария — sign и verify, соответственно. Текст сценариев приведен ниже, согласен что они несколько костыльные, но писалось на скорую руку, а на тот момент бета-версия CryptoPro 4.0 ведя себя странно, при прямой передаче путей к подписываемым, и выходным файлам.


sign
#!/bin/sh
DIR=`dirname $1`
/opt/cprocsp/bin/amd64/cryptcp -signf $2 $3 -cert -der -norev "$1"
mv "$1.sgn" "$1.p7s"


verify
#!/bin/sh
DIR=`dirname $1`
cp "$1.p7s" "$1.sgn"
/opt/cprocsp/bin/amd64/cryptcp -vsignf -der -norev "$1"
rm "$1.sgn"

Во-вторых, и это очень важно мы имеем следующую картину. в 1С бухгалтерии штатные настройки работы с СКЗИ КриптоПро приведены для версии 3.6. С версией 3.6 работает старая версия CryptoFox. На этом достоинства заканчиваются и начинается головная боль. Старая версия CryptoFox не отображает ни один современный сайт, даже портал налоговой инспекции куда-то уползает. При попытке установить ~свежую~ актуальную версию CryptoFox 31, она падает в корку (Segmentation fault) при входе на любой сайт требующий наличия HTTPS с алгоритмом ГОСТ. Иногда падает даже при работе плагина CryptoPro Browser Plugin. Кстати, тоже весьма старой версии, поддерживающей только подпись, но не шифрование и работающий только с NPAPI.

С версией 3.9 ситуация ещё веселее — 1С её уже не видит, но CryptoFox ещё падает, при чем как старый, так и новый.

Версия 4.0, напротив — не видится 1С, но зато с ней заводится CryptoPro Browser Plugin 2.0, работает вход на госплощадки из CryptoFox (о них разговор отдельный, и если разбирать работу из ОС GNU\Linux с ними — материала хватит на ещё одну статью). Проблема — заставить увидеть 1Ску установленный СКЗИ. Проблема в общем то не такая уж и серьёзная, решается буквально за пятнадцать секунд, но на поиск самого решения ушла целая неделя общения с техподдержкой КриптоПро (и отпинывания меня поддержкой 1С на инструкцию в ИТС). В итоге проблема была решена самостоятельно, и решение в конечном итоге опубликовано на форуме КриптоПро. Методология решения проблемы на будущее:


  • В 1С бухгалтерии имеется возможность добавить произвольный криптопровайдер. Воспользуемся этим механизмом, добавьте нового криптопровайдера, и назовите его, скажем «КриптоПро CSP 4.0».


  • Для того чтобы получить имя криптопровайдера и его тип, нам нужно обратиться к утилите КриптоПро. Проще всего получить эти данные, выведя список установленных сертификатов:
/opt/cprocsp/bin/amd64/certmgr -l


  • Указываем следующие данные:
    Имя программы Crypto-Pro GOST R 34.10–2001 KC1 CSP
    Тип программы 75
    Алгоритм подписи GOST R 34.10–2001
    Алгоритм хеширования GOST R 34.11–94
    Алгоритм шифрования GOST 28147–89
  • Сохраняем криптопровайдер и указываем путь к библиотеке: /opt/cprocsp/lib/amd64/libcapi20.so

Готово, 1С теперь видит установленный криптопровайдер. Казалось бы — всё, можно проступать к добавлению сертификатов и настройке сдачи отчётности, но не тут то было. Маленькая беленькая сибирская лисичка подкралась к нам откуда мы и не ждали — от самих разработчиков 1С. Так исторически сложилось, что подсистему электронного документооборота, 1С-Отчетность, ядро 1С и конфигурации пишут разные люди, и даже разные компании. При создании конфигураций для 1С 8.3, например «Бухгалтерия предприятия 3.0», разработчики не долго думая перенесли всю подсистему ЭДО «как есть» без изменений, в результате чего мы получаем парадокс. Сама 1С бухгалтерия видит СКЗИ, видит сертификаты, позволяет их установить, подписать и зашифровать любые документы, но при этом система электронного документооборота в упор не видит ни одного установленного сертификата, и соответственно не может даже получить начальную конфигурацию от оператора документооборота — её попросту нечем расшифровывать. Вернее чем расшифровывать есть, но подсистема ЭДО использует свой собственный механизм работы с СКЗИ, задействуя внешнюю компоненту (только для Windows) и ничего не знает о существовании встроенных механизмов работы с СКЗИ, которые использует сама 1С в рамках конфигурации.

Если мы откроем конфигуратор и включим режим отладки, мы увидим следующую картину:
Формы 1С-Отчетности используют Общие→ОбщиеМодули→КриптографияЭДКОКлиент, который в свою очередь опирается на работу внешней компоненты Addin.ЭДОNative.CryptS.
Тот же функционал работы с электронной цифровой подписью и шифрованием (без функционала обмена транспортными контейнерами по электронным каналам связи) реализован в Общие→ОбщиеМодули→ЭлектроннаяПодписьКлиент, которая учитывает работу в ОС семейства Linux и корректно загружает как и внешнюю компоненту работы с XMLDSig, так и модуль криптопровайдера. Данная библиотека корректно видит все сертификаты, позволяет осуществлять подпись и шифрование документов, содержит функции для работы как с объектами в памяти так и с файлами на жестком диске. Данная библиотека используется во всех стандартных механизмах работы с ЭЦП внутри 1С, кроме подсистемы 1С-Отчетности (ЭДО).

То есть для реализации работы подсистемы 1С ЭДО достаточно переписать либо формы 1С-Отчетности на использование встроенных механизмов, либо перегрузить КриптографияЭДКОКлиент, для использования не внешней компоненты, а переадресовывать вызовы работы с сертификатами, ЭЦП и шифрованием на встроенный клиент работы с СКЗИ.
Общение с техподдержкой 1С дало лишь ответ что они в курсе данной проблемы, но клиентов использующих ОС GNU\Linux слишком мало (потребность не носит массовый характер), но задача у них «записана».

© Geektimes