Цифровая подпись Cades-BES для XML средствами 1С с помощью КриптоПро

Публикация № 1058940

Программирование - Защита и шифрование

Обработка цифровая подпись ЭЦП КриптоПро CadesBES ГИС ЖКХ XML

1
Обработка иллюстрирует возможность подписания XML SOAP-конверта по стандарту Cades-BES средствами 1С с помощью внешней компоненты КриптоПРО "CAdESCOM" с учетом ГОСТ 2001 и ГОСТ 2012. Стандарт используется в различных механизмах государственных сайтов России, в том числе в СМЭВ и ГИС ЖКХ. Код не привязан к прикладному решению может быть встроен куда угодно, но только на платформе Windows.

Для работы с ГИС ЖКХ из 1С через API понадобилось выполнять цифровую подпись. Поначалу использовался OpenSSL + Python вот отсюда. Там сама подпись и контрольные суммы генерируются с помощью OpenSSL, а скрипт вставляет в исходный XML необходимые узлы.

Во-первых, все это работает через консоль, что не очень быстро. Во-вторых, OpenSSL принимает закрытый ключ в открытом PEM формате, что само по себе безобразие. В-третьих, с переходом на ГОСТ 2012 все это стало невозможно, поскольку инструментов извлечения закрытого ключа в формате PEM из сертификата, выполненного по ГОСТ 2012 не нашлось.

Штатный менеджер криптографии 1С помочь не может, так как подписывать XML не умеет, может только вернуть подпись для потока данных в формате CMS (базируется на PKCS#7), а необходима только сигнатура, длиной в 64 байта.

В итоге пришлось написать обработку, которая выполняет то же самое, что выполнял скрипт на Python.

Обработка подписывает стандартный SOAP-конверт <envelope>, для примера в ней есть тестовый запрос. Разумеется, для подписи в системе должен стоять КриптоПро, к нему должен быть подцеплен сертификат. Пробную версию КриптоПро можно скачать и установить бесплатно на официальном сайте. Тестовый сертификат можно выпустить там же, в тестовом удостоверяющем центре.

Для получения сигнатуры и хеша используется COM-объект "CAdESCOM", поставляемый вместе с КриптоПро. Менеджер криптографии 1С используется для получения данных сертификата - издателя и открытого ключа. Можно было бы обойтись без него, но с ним удобнее. Кроме того, используется COM-объект "System.Text.UTF8Encoding" для конвертации строки в массив байт COMSafeArray в кодировке UTF8. К сожалению, на выходе у XML полностью теряется форматирование. Избежать этого не получилось, так как оно уничтожается при каноникализации средствами 1С. Обратно возвращать форматирование уже нельзя, подпись становится невалидной.

Методика не привязана к конкретному прикладному решению и работает как на сервере, так и на клиенте. Тестировалось на релизе 8.3.13.1513. На более ранних будет работать вплоть до релиза, где есть МенеджерКриптографии, ДокументDOM, ДвоичныеДанные, ПреобразованиеККаноническомуXML и функции для работы с Base64.

P.S. Буду очень благодарен, если кто-нибудь сможет ответить на пару вопросов:

1. Так как используется COM, работать все это будет только на Windows. Если конвертацию в UTF8 можно переписать на 1С, то аналога CAdESCOM в Linux нет и не будет. Может, кто знает, как можно получить хеш и сигнатуру из КриптоПро в консоли на Linux.

2. Элемент подписи создается с помощью ДокументDOM фактически вручную, то есть поэтапным созданием каждого узла. Дописать в ДокументDOM кусок получилось из объекта ФабрикаXDTO, но началась путаница с пространствами имен и каноникализацией. Возможно, все-таки перепишу с использованием фабрики и макета. А вот вставить в один ДокументDOM кусок другого ДокументDOM, созданного из макета, у меня не получилось, хотя в СП такая возможность вроде как декларируется. Если кто подскажет, как - скажу спасибо.

P.P.S. Не на тему ЭЦП, но около. Если кто-нибудь озадачится вопросом создания туннеля по стандарту ГОСТ 2012, как этого требует ГИС ЖКХ и не только он, при наличии КриптоПро с этим отлично справляется их форк STunnel - stunnel-msspi. В него уже встроены необходимые алгоритмы, при этом нет необходимости вытаскивать ключ из КриптоПро и хранить его в открытом виде, как требуется в случае использования оригинального STunnel. Достаточно только указать открытый ключ сертификата или имя хранилища в КриптоПро.

1

Скачать файлы

Наименование Файл Версия Размер
Цифровая подпись Cades-BES для XML средствами 1С с помощью КриптоПро:
.epf 14,62Kb
10.05.19
2
.epf 14,62Kb 2 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. akela2014 4 15.05.19 09:12 Сейчас в теме
"Если кто-нибудь озадачится вопросом создания туннеля по стандарту ГОСТ 2012, как этого требует ГИС ЖКХ"©
Интеграция в ГИС ЖКХ работает только с ГОСТ 2001 и неизвестно когда у них ГОСТ 2012 будет.
2. akela2014 4 15.05.19 14:05 Сейчас в теме
"поскольку инструментов извлечения закрытого ключа в формате PEM из сертификата, выполненного по ГОСТ 2012 не нашлось."
Есть такие
http://www.lissi.ru/ls_product/utils/p12fromcsp/
5. PythonJ 79 20.05.19 08:21 Сейчас в теме
(2) Из ГОСТ 2001 доставал PEM именно этой утилитой. На просторах Интернета нашлась. Но с ГОСТ 2012 не справилась. Можно, конечно, купить последнюю версию, но хранить ключ в PEM - по определению небезопасно. Да и зоопарк устраивать нет желания. OpenSSL из коробки ГОСТ 2012 не умеет. Надо собирать руками. STunnel - аналогично. Скрипт на Python работает с временными файлами, что само по себе не быстро. Кстати, не думаю, что в корпоративной среде допустимо использовать такие кулибинские методы для работы с криптографией.
Проще и логичнее купить КриптоПро и решить все проблемы разом.
Жалко вот, что подписывать получается только под Windows.
3. akela2014 4 16.05.19 14:12 Сейчас в теме
Неожиданный ответ от поддержки ГИС ЖКХ получили )))
ТО есть они уже сделали но как нам сделать не сказали)))

"Поддержка стандарта усиленной квалифицированной электронной подписи ГОСТ Р 34.10-2012 «Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи» для организации шифрованного канала передачи данных при интеграционном взаимодействии, а также для подписания интеграционных пакетов в информационной системе жилищно-коммунального хозяйства (далее - система) осуществляется с версии системы 12.2.2.15.

Поддержка ГОСТ Р 34.10-2001 в системе будет осуществляться до 31.12.2019.

Дополнительно сообщаем, что в ближайшей версии системы в документации «Альбом ТФФ» будет добавлен пример запроса, подписанного с использованием сертификата с ГОСТ 34.10-2012 в пункт "2.2 Процедуры приема и передачи информации через SOAP веб-сервисы."."©
4. PythonJ 79 20.05.19 08:15 Сейчас в теме
(3) Конечно уже работает. В районе января-февраля пробовал, тогда еще не работала. Узнал, что ГОСТ 2001 будет работать до конца года и махнул на это дело рукой. А вот недавно, в апреле 2019 одна из контор, с которой я работаю, перевыпустила сертификат. Выдали уже только один сертификат по ГОСТ 2012. В конце 2018 года выдавали сразу два по двум стандартам. Самое интересно, что в тот момент, когда выпустили новый сертификат, предыдущий по ГОСТ 2001 тут же оказался отозванным, хотя срок его действия на тот момент еще не истек. Пришлось в срочном порядке разбираться с ГОСТ 2012 и выяснилось, что ГИС ЖКХ тихой сапой уже включили его поддержку.
Кстати, нам ответ прислали один в один такой же.
6. PythonJ 79 20.05.19 09:09 Сейчас в теме
Отвечу себе сам на вопрос по поводу COM и Windows.
Все то, что сейчас выполняется средствами CadesCOM, можно выполнить консольными командами с помощью утилит cryptcp и csptest, которые будут работать не только в Windows. Cryptcp позволяет получить хеш-суммы и открепленную подпись. А с помощью csptest можно выдернуть из подписи сигнатуру в 64 байта.
Ложка дегтя - в процессе одной подписи будут неоднократно использоваться временные файлы. Если количество сообщений ощутимое, из соображений быстродействия стоит создать RAM-диск маленького размера для этих файлов.
Как только реализую подпись без COM-объектов - выложу. Заодно сравню скорость.
7. ЕлыПалы 27.05.19 08:53 Сейчас в теме
Добрый день! Скачали Вашу разработку "Цифровая подпись Cades-BES для XML средствами 1С с помощью КриптоПро" для подписи файлов для ГИС ЖКХ и сразу столкнулись с трудностями. При нажатии кнопки "Выбрать сертификат" и ответа на вопрос, что сертификат подписи находится на клиенте выдается ошибка "Возможно не установлен КРИПТО-ПРО или используется операционная система, отличная от Microsoft Windows". Хотя на компьютере установлена последняя версия 4.0.9944 (так утверждает админ, который сейчас находится в отпуске :) Подскажите, что делать?
8. ЕлыПалы 27.05.19 08:54 Сейчас в теме
Какая-то мистика происходит. Компоненту установил, но результат тот же. Версия 1С:Предприятие 8.3 (8.3.12.1714). Попробовал подключить компоненту через 8.2. Работает. COM-объект успешно подключается. Сертификаты все отображаются в списке выбора. Подписать пока не получается в 8.2 по уже другим и понятным причинам.
9. ЕлыПалы 27.05.19 08:54 Сейчас в теме
Вот что выдает ОписаниеОшибки(): {ВнешняяОбработка.Подписать.Форма.Форма.Форма(41)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса
10. ЕлыПалы 27.05.19 08:55 Сейчас в теме
Есть подозрение, что причиной ошибки является то, что КриптоПро стоит на одном компьютере, а 1С стоит на другом сервере ...
11. ЕлыПалы 27.05.19 09:05 Сейчас в теме
Попробовал установить в качестве эксперимента на компьютере где стоит КриптоПро файловую 1С и подписать сообщение. Все заработало
12. PythonJ 79 27.05.19 10:08 Сейчас в теме
КриптоПро и компонента CADeSCOM должны стоять на той машине, на которой осуществляется подпись. Если подпись выполняется на клиенте, то все это должно стоять на том компьютере, с которого запускается клиент. То есть на том, за которым вы открыли 1С. Сертификат в КриптоПро должен быть прицеплен к вашей учетной записи за этим ПК. Если подпись выполняется на сервере - ситуация совершенно иная.
1. Сервер 1С должен работать под управлением MS Windows, так как если сервер работает под Linux, то о CADeSCOM можно забыть. COM-объектов там нету.
2. КриптоПро и CADeSCOM должны стоять на сервере 1С. Обратите внимание, серверные версии КриптоПро, то есть которые можно поставить на Windows Server, стоят совершенно других денег. Если лицензия на обычный КриптоПро стоит порядка 2000 - 3000 руб, то серверная, насколько я помню, больше 40000.
3. Cертификат должен быть прицеплен к КриптоПро на сервере к пользователю, под которым работает служба сервера 1С. Как правило USR1CV8. Тут возникает две проблемы. Во-первых, чтобы это сделать, нужно либо вручную править ветку реестра этого пользователя, либо временно дать ему право интерактивного входа в систему, зайти под ним и добавить сертификат. Вторая проблема хуже. Подобное решение - очень серьезная дыра в безопасности. Фактически, доступ к сертификату имеет любой пользователь, вошедший в 1С. Тут можно всякого разного придумать - защитить сертификат PIN-кодом, запретить выполнение обработок и т.д.
В обработке я не ставил своей задачей грамотно решить вопрос безопасности в случае, когда подпись происходит на сервере.
13. ЕлыПалы 04.06.19 12:24 Сейчас в теме
Дмитрий, добрый день! На все запросы getStateRequest возвращает одну и ту же ошибку AUT011005 "Ошибка формата подписи запроса". Проверка этих запросов в SoapUI на валидность проходит на ура. Никаких претензий к запросам нет. Вы не сталкивались с такой проблемой?
14. ЕлыПалы 04.06.19 14:51 Сейчас в теме
Вот что на это отвечает служба поддержки ГИС ЖКХ:
На текущий момент в приложенном Вами запросе возникает ошибка "AUT011005 Ошибка формата подписи запроса", которая отображается в связи с некорректной подписью запроса. В частности возникает проблема при обработке группы тегов xades:SigningCertificate.
Во вложении предоставлен пример структуры электронного сообщения, подписанного по ГОСТ Р 34.11-2012/34.10-2012
Прикрепленные файлы:
пример 2012.xml
15. PythonJ 79 18.06.19 19:18 Сейчас в теме
(14)
Если один и тот же запрос при отправке из SoapUI отправляет корректно, а при отправке из 1С не работает, могу только предположить, что с запросом еще что-то происходит перед отправкой из 1С. Дело в том, что после подписи в теле запроса нельзя менять ни одного байта - подпись сразу станет невалидной. Даже перенос строки убрать/добавить нельзя. В настоящее время у меня работает отправка из 1С по ГОСТ 2012 без проблем. Нужно смотреть на код. Если хотите - сделайте демо-процедуру с подписью и отправкой с обращением, например, к nsi-common и пришлите.
16. PythonJ 79 18.06.19 21:25 Сейчас в теме
(14)
Посмотрел внимательно на пример от СП ГИС ЖКХ. Странное дело. По логике вещей, моя обработка не должна бы работать, потому что кроме дайджеста самой подписи все хеширование выполняется старым алгоритмом ГОСТ 2001. Но тем не менее, у меня обмен работает. Видимо, перестанет после окончания поддержки в 2020 году. Поправлю обработку и сделаю все дайджесты одинаковыми. Спасибо за наводку.
Оставьте свое сообщение