1с менеджеркриптографии подписать строку
Хочу рассказать, как мы внедряли электронно-цифровую подпись в сети супермаркетов.
Наша торговая сеть — региональная, всего 10 магазинов. Ассортимент в основном продукты питания, часть из которых являются собственным производством. Для передачи сырья в производство и получения готовой продукции используются два документа — М-11 и МХ-18. С этих документов было решено начать внедрение ЭЦП. Основная цель работы с ЭЦП — освободить пространство, занятое документами в бумажном виде и ускорить процесс подписания документов.
Основная учетная система в нашей торговой сети построена на базе 1С 7.7, следовательно вышеупомянутые документы должны создаваться на основании информации, внесенной в нашу учетную систему. Было принято решение сами документы подписывать и хранить в формате pdf. Таким образом, схема получается следующая: формируем документ в 1С 7.7, сохраняем в mxl (1С 7.7 не умеет сохранять файлы в pdf) (почему в mxl, а не в xls, например, станет понятно дальше) в специально отведенную для этого дела папку, затем преобразовываем его в pdf, и последним шагом все ответственные лица подписывают документ (создают файл подписи).
Так как мы начали проект по переходу на новую учетную систему на базе 1С 8.3, то было решено именно это ПО использовать для преобразования сохраненного файла (документа М-11 или МХ-18) в формат pdf, благо в отличии от семерки 1С 8.3 это умеет. Кроме этого 1С 8.3 умеет подписывать файлы, если на компьютере установлено КриптоПРО и сертификат ЭЦП. В случае выбора 1С 8.3 не требуется установка ПО КриптоАРМ (для интерактивного подписания электронных документов).
Кроме этого для каждого сотрудника организации, который должен подписывать электронные документы, требуется создать сертификат (закрытый и открытый ключ) и установить на флешку или на компьютер.
После обсуждения с юристами пришли к выводу, что всех устроит следующий вариант: у нас есть сертификат подтвержденный в удостоверяющем центре на директора организации, и если мы создадим сертификаты (сертификаты создаются с помощью ПО КриптоАРМ) на каждого сотрудника и подпишем сертификатом директора, то будет все юридически верно.
Приступаем к реализации:
- Из 1С 7.7 документы М-11 и мх-18 формировались и раньше с тем лишь отличием, что после формирования распечатывались, а не сохранялись в сетевую папку, поэтому здесь не потребовалось много дорабатывать систему.
- В 1с 8.3 создаем процедуру, которая открывает mxl файл и сохраняем его в pdf, после чего создается задача (объект метаданных в 1с 8 задача), внутри которой хранится путь к файлу — электронному документу. Эту процедуру закрепляем в регламентное задание. С этим тоже не пришлось испытывать особых проблем.
- Все созданные задачи отправляются сотрудникам, которые должны подписывать документы. При выполнении задачи каким-то сотрудником файлы записанные в виде путей в задаче должны подписаться. Таким образом на выполнение задачи вешаем событие — поиск файла и подписание.
- Теперь немного подробнее про подписание средствами 1С 8.3. Для подписания файла необходимо, чтобы сертификат был установлен на компьютере или на флешке, а флешка вставлена на компьютер; также нужны двоичные данные сертификата. Мы используем 1С ERP, там есть справочник сертификатов, в котором уже создан реквизит для хранения двоичных данных. При создании сертификата, нужно не забывать добавлять его в справочник 1С. При подписании документа нужно знать элемент справочника, соответствующий сертификату сотрудника, осуществляющего подпись, поэтому выбор элемента справочника из списка будет предложено выбрать сотруднику.
Еще раз, в целом, схема работы следующая: оператор ПК создает и сохраняет электронные документы из 1С 7.7 в формате mxl, раз в полчаса запускается 1С 8.3 и преобразовывает документ mxl в файл с расширением pdf. Также восьмерка создает задачи всем ответственным лицам, которые должны подписать документы. Когда создается задача и направляется исполнителю, происходит оповещение по электронной почте. После этого пользователь открывает 1с 8 и выполняет задачу. При выполнении выпадает список сертификатов, занесенных в 1С, пользователь выбирает свой (он уже установлен на компьютере в реестр), вводит пароль от сертификата, после чего файлы подписываются, а задача выполняется.
Эта статья описывает готовое решение для выполнения задач по формированию цифровых подписей, проверке подписей, а так же шифрованию и дешифрованию данных.
Обмен с онлайн кассами, биткоины – часто встречающиеся в моей практике темы для разработки, в которых используется шифрование передаваемых данных. В моем случае, под шифрованием я подразумеваю в т.ч. формирование электронной цифровой подписи с последующей валидацией.
Прошу помнить, что разработка средств криптографии регулируется Федеральным Законом "О лицензировании отдельных видов деятельности" а значит требует наличия лицензии, поэтому прежде чем использовать приведенное ниже решение в коммерческих целях прошу ознакомиться законом.
Маленькая оговорка: в действительности лицензирование требуется только в том случае, если вы продаёте программное средство, то есть осуществляете предпринимательскую деятельность. В случае если вы делаете это программное средство для себя и своего предприятия, то это выходит за рамки ФЗ "О лицензировании отдельных видов деятельности" (в следствие отсутствия деятельности как таковой).
Когда мне была поставлена задача реализовать подписание ЭЦП по алгоритму SHA 256- rca паддинг pkcs 1 с ключами 2048 я решил, что сделаю все в 3 строки кода:
Как выяснилось почти сразу, кроме этих магический строк в платформу встроены еще пара других алгоритмов получения хэшей и все.
Но где же RSA ? А ключи? Короче ждал меня облом.
Можно задействовать внешний криптопровайдер, но это стоит денег, да и сервер на котором все должно работать находится в Америке и там же админится, дадут ли устанавливать лишний софт – большой вопрос.
Поиски в интернете готового решения не дали, пришлось садиться в студию и кодить компоненту net .
Для запуска компоненты используется C ++ компонента NETLoader , скачанная с инфостарта.
В архивах к публикации можно найти демо-обработку, реализующую логику шифрования/дешифрования, создания и проверки цифровой подписи, и компоненты отдельно.
Все процедуры выполняются в один поток и на больших данных могут подвисать. Но на практике мне такое не встретилось.
В этом видео показано как все работает:
Для тестирования методов компоненты (без учета особенностей работы платформы 1с) реализовано Windows приложение (см в архиве WindowsFormsTest1.exe). Компонента адаптирована для работы как с платформой 1с, так и как самостоятельного решения для использования в других задачах. Требования – net.3.5. Тестирование производилось на платформе 8.3.12 на управляемом интерфейсе в контексте сервера. Компонента реализует:подписание по алгоритму SHA-256 с шифрованием хеша подписи по алгоритму RCA PKCS1 при помощи, ключей размером 2048
проверку (валидацию) подписи
шифрование и дешифровку данных по алгоритму RSA PKCS1 про помощи ключей, размером 2048
В 1с компоненту можно задействовать при помощи служебной компоненты netloader.dll (встроена в фреймворк).
Создание ключей шифрования
Назначение: создает новые ключи шифрования
Имя метода: GetKeysInXML(string randomstring)
Параметры: randomstring (произвольная строка, обязательный параметр) – не используется, остался в наследие от первой версии компоненты.
Возвращаемое значение: Истина или Ложь.
Приватный и публичный ключ можно получить, обратившись к свойствам компоненты publicKey и privateKey
Значения ключей представлены в формате XML, поля которого содержат двоичные данные в формате base64
Формирование цифровой подписи
Назначение: формирует цифровую подпись переданных данных
Имя метода: SignData(string DataToSign, string privateKey)
Параметры: DataToSign (строка) – данные, которые необходимо подписать; privateKey (строка) – приватный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Значение подписи можно получить, обратившись к свойству компоненты Base64SignedHash
Значение – это двоичные данные в формате base64
Проверка цифровой подписи
Назначение: возвращает результат проверки цифровой подписи
Имя метода: VerifySignature(string DataToSign, string signature, string publicKey)
Параметры: DataToSign (строка) – данные, которые необходимо подписать; signature (строка) – цифровая подпись в формате base64; privateKey (строка) – приватный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Если подпись прошла проверку – возвращает Истина
Шифрование данных
Назначение: шифровка данных
Имя метода: EncryptData(string originalMessage, string publicKey)
Параметры: originalMessage (строка) – данные, которые необходимо зашифровать; publicKey (строка) – публичный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Результат шифрования можно прочитать из свойства encripteddata
Дешифрование данных
Назначение: дешифровка данных
Имя метода: DecryptData(string originalMessage, string privateKey)
Параметры: originalMessage (строка) – данные, которые необходимо расшифровать; privateKey (строка) – приватный ключ в формате XML. Возвращаемое значение: Истина или Ложь
Возвращаемое значение: Истина или Ложь
Результат шифрования можно прочитать из свойства decripteddata;
Обработка ошибок
Если методы компоненты возвращают Ложь, возможно, в передаваемых параметрах допущены ошибки. Получить описание последней ошибки можно обратившись к свойству компоненты lasterror (строка)
Шифрование - обратимое преобразование некой информации с целью сокрытия от неавторизованных лиц и, в это же время, предоставление, авторизованным пользователям доступа к ней. Главная задача шифрования - это соблюдение конфиденциальности передаваемой информации.
- Симметричное шифрование - использует один и тот же ключ и для зашифрования, и для расшифрования;
- Асимметричное шифрование - использует два разных ключа: один для зашифрования (который также называется открытым), другой для расшифрования (называется закрытым).
Создание временного сертификата
Пример создания временного сертификата для тестирования шифрования в 1С:
makecert.exe -r -pe -n CN="www.example.com" -ss my -sr currentuser
-sky exchange -sp "Microsoft Strong Cryptographic Provider"
2. Создание временного сертификата |
Реализация шифрования
МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,
РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(Base64Значение(Отпечаток));
ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ИмяВременногоФайла, Сертификат);
УдалитьФайлы(ИмяВременногоФайла);
Возврат Base64Строка(ЗашифрованныеДанные);
МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПарольЗакрытогоКлюча;
РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(Base64Значение(ЗашифрованныеДанные));
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
РасшифрованныеДанные.Записать(ИмяВременногоФайла);
ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла, "CESU-8");
СтрокаДанных = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Возврат СтрокаДанных;
В данной функции инициализируется менеджер криптографии и указывается пароль к контейнеру закрытого ключа. Далее происходит расшифровка зашифрованных данных. Результатом расшифрования являются двоичные данные, которые записываются в файл с кодировкой CESU-8 и считываются из него.
.pem легко конвертировать в практически любой другой удобоваримый формат.
Со строкой проблем нет, проблема с .pem
Ошибка при вызове конструктора (СертификатКриптографии)
Сертификат = Новый СертификатКриптографии("c:\temp\c.pem");
В теории в pem может быть все, что угодно - и только один сертификат и все вместе (сертификат с закрытым ключом и плюс промежуточные сертификаты).
правда, тэги при этом вроде бы такие
----- BEGIN CERTIFICATE -----
----- END CERTIFICATE -----
или
----- BEGIN PRIVATE KEY-----
----- END PRIVATE KEY-----
в том числе может быть и открытый ключ (public key), как у автора.
Как я и говорил. Да и чисто логически: что может удостоверить подпись, сделанная при помощи открытого ключа, который при необходимости рассылается всем и каждому? Что владелец ключа прочитал файл? Ну, разве что.
Подпись ставится закрытым ключом, которого у ТС просто нет. А при помощи открытого ключа (сертификата) она проверяется, если нужно.
в данном же случае вопрос интересный чисто с прикладной точки зрения
Новый СертификатКриптографии(<ИмяФайла>)
Параметры:
Тип: Строка.
Имя файла, из данных которого будет создан сертификат.
Описание:
но вот не нашла, где сказано, какой именно тип файла.
знаю только, что с файлами .cer работает отлично.
а вот про другие типы файлов - молчок. не нашла.
так что не суть важно, что там конкретно внутри у автора в .pem, суть в том, что pem надо конвертировать. Он до подписания и не доходит, у него раньше вылетает.
не суть важно, что там конкретно внутри у автора в .pem Как раз важно: в PEM нет закрытого ключа, см. ссылку в (6).Да пофиг, конвертируй - не конвертируй, закрытый ключ от этого не появится.
А без него подписать не получится, об этом и на ИТС пишут:
ВНИМАНИЕ! Механизм криптографии «1С:Предприятия» не содержит реализации собственно алгоритмов криптографии. Он обеспечивает набор объектов, позволяющих взаимодействовать с внешними модулями криптографии сторонних производителей.
Открытый ключ предназначен для передачи по открытым каналам. Закрытый ключ для распространения не предназначен и должен быть максимально защищен.
и проблему с .pem вынесла отдельно.
Допустим у кого то другого возникнет аналогичный вопрос с .pem, содержащим private.key
Или у кого то возникнет обратная задача - проверить подпись с помощью открытого ключа .pem с public.key
В любом случае задача получить сертификат из .pem имеет отдельное прикладное значение.
тогда вопрос в сабже для этого другого останется актуальным.
Меня не интересовал конкретный файл .pem с конкретным содержимым у автора.
С этим понятно, чего тут обсуждать.
Собственно говоря, меня интересовала только одна часть сабжа, а что именно конкретно, изложено в (11)
И вот в связи с этим помнится мне, что у Олега Гинзбурга aka Abrahams aka Smaharba встречала я где-то, как он изящным движением руки превращал то ли .pem в .cer, то ли наоборот. Безо всяких openssl и тому подобных приблуд. То есть обходился без ручной готовки файла.
Читайте также: