Современные требования информационной безопасности часто накладывают жесткие ограничения на работу с персональными данными и коммерческой тайной. Одной из таких задач является отказ от хранения промежуточных файлов на дисках серверов при обмене данными. Если нам необходимо передать пакет данных (например, в формате JSON) через HTTP-сервис или брокер сообщений (RabbitMQ, Kafka), и при этом обеспечить доверие приемника к источнику, мы сталкиваемся с необходимостью наложения электронной подписи. Разберем подробно, как это реализовать в среде 1С:Предприятие.
Проанализируем наиболее технологичный способ, который позволяет работать в оперативной памяти сервера без записи временных файлов. В платформе 1С существует штатный объект МенеджерКриптографии, предназначенный для выполнения операций подписания, расшифровки и проверки подписи. Главное преимущество этого метода — поддержка работы с объектом ДвоичныеДанные.
Рассмотрим пошагово процесс подписания произвольной строки JSON:
ДвоичныеДанные, используя нужную кодировку (обычно UTF-8).МенеджерКриптографии, указав имя криптопровайдера (например, "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider").Подписать().Посмотрим на пример кода, реализующий эту логику:
// 1. Формируем данные
ДанныеДляПодписи = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,,, ЭлементыСоставаJSON.СимволыРазделители);
ДанныеДляПодписи.УстановитьСтроку(ПараметрыЗаписиJSON);
// ... заполнение JSON ...
СтрокаJSON = ДанныеДляПодписи.Закрыть();
// 2. Преобразуем в двоичные данные
ДвоичныеДанныеJSON = ПолучитьДвоичныеДанныеИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
// 3. Работа с криптографией
Менеджер = Новый МенеджерКриптографии("", "", 80); // 80 - тип провайдера для ГОСТ 2012
Менеджер.ПарольДоступаКЗакрытомуКлючу = "ВашПароль";
// Ищем подходящий сертификат в личном хранилище сервера
Хранилище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,
РасположениеХранилищаСертификатовКриптографии.ДанныеПриложения);
Сертификаты = Хранилище.НайтиПоОтпечатку(ОтпечатокСертификата);
Если Сертификаты.Количество() > 0 Тогда
Сертификат = Сертификаты[0];
// 4. Подписываем данные (false - отсоединенная подпись)
ОбъектПодписи = Менеджер.Подписать(ДвоичныеДанныеJSON, Сертификат, Ложь);
// 5. Кодируем подпись в Base64 для передачи внутри JSON
СтрокаПодписи = Base64Строка(ОбъектПодписи);
КонецЕсли;
В данном примере мы получили отсоединенную подпись (Detached Signature). Это наиболее удобный формат для API: вы отправляете сам JSON, а в отдельном поле или заголовке HTTP-запроса передаете строку Base64. Приемник, имея ваш публичный ключ, сможет проверить, что данные не менялись в процессе передачи.
Выясним ситуацию, когда безопасность требует не столько подписи каждого конкретного сообщения, сколько подтверждения того, что запрос пришел именно от вашей системы 1С. В этом случае эффективнее использовать Mutual TLS (mTLS). Это механизм, при котором при установке защищенного HTTPS-соединения клиент (1С) предъявляет свой сертификат серверу.
Для реализации этого метода в 1С не нужно писать сложный код шифрования. Достаточно правильно настроить объект HTTPСоединение. Рассмотрим, как это сделать:
// Путь к файлу сертификата и ключу (или использование системного хранилища)
СертификатКлиента = Новый СертификатКриптографии(ПутьКФайлуСертификата);
// Настройка защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),
Новый ВалидацияСертификатаПереченьСертификатов());
// Если сертификат установлен в ОС, 1С сама предложит его при соединении
HTTPСоединение = Новый HTTPСоединение("api.mycompany.ru",,,, , , Защита);
Важно помнить, что при использовании ЗащищенноеСоединениеOpenSSL на Linux-серверах, сертификаты должны быть доступны в соответствующих путях файловой системы, а криптопровайдер должен поддерживаться установленной версией библиотеки OpenSSL.
Разберем ситуацию, когда по каким-то причинам стандартный МенеджерКриптографии не подходит (например, специфические настройки провайдера или требования использовать только внешние сертифицированные средства). В этом случае можно воспользоваться утилитой cryptcp от КриптоПро.
Хотя исходная задача требовала "уйти от записи файлов", при использовании командной строки нам все равно придется создать временный файл на долю секунды, подписать его и сразу удалить. Это допустимый компромисс, если временный каталог находится в оперативной памяти (RAM-диск) или защищен правами доступа.
Алгоритм действий следующий:
ПолучитьИмяВременногоФайла().ЗапуститьПриложение().УдалитьФайлы().Пример командной строки для подписи:
cryptcp -sign -dn "CN=MyCertificate" -der input.json output.json.sig
Проанализируем современный подход, который внедряется в крупных организациях. Если служба безопасности запрещает хранение закрытых ключей (сертификатов с ключами) непосредственно на серверах 1С, используется КриптоПро DSS.
В этом случае схема работы меняется:
ХешированиеДанных).Это самый безопасный метод, так как закрытый ключ никогда не покидает защищенного хранилища, а временные файлы не создаются вовсе.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), настоятельно рекомендуем использовать программный интерфейс модуля ЭлектроннаяПодпись. Разработчики БСП уже реализовали обработку множества нюансов: кроссплатформенность, работу с различными криптопровайдерами и удобный выбор сертификатов.
Функция ЭлектроннаяПодпись.ПодписатьДвоичныеДанные() позволит вам выполнить задачу одной строкой кода, автоматически обрабатывая ошибки и логируя процесс, что значительно упрощает дальнейшую поддержку системы.
Важный момент: при передаче подписанных данных в брокеры сообщений (такие как RabbitMQ), всегда упаковывайте подпись и данные в структуру JSON так, чтобы принимающая сторона могла однозначно сопоставить их. Использование заголовков сообщения (Message Properties) для хранения подписи также является хорошим тоном, так как это не "загрязняет" тело самого бизнес-сообщения.