Как подписать файл по алгоритму sha1RSA в 1С и исправить ошибку «Неизвестный алгоритм криптографии»

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с электронно-цифровой подписью (ЭЦП) в 1С часто вызывает трудности у разработчиков, особенно когда приходится сталкиваться со специфическими требованиями внешних сервисов. Одной из типичных проблем является необходимость подписать файл алгоритмом sha1RSA (или RSA с хешированием SHA-1). При попытке указать это название напрямую в коде платформа выдает ошибку: «Недопустимое значение. Неизвестный алгоритм криптографии».

В этой статье мы подробно разберем, почему возникает данная ошибка, как правильно настроить штатный МенеджерКриптографии в 1С для работы с этим алгоритмом, а также рассмотрим альтернативные и кроссплатформенные варианты решения задачи.

Выясняем причину ошибки: почему sha1RSA не работает «из коробки»

Проанализируем ситуацию. Разработчики часто пытаются передать комбинированное название алгоритма напрямую в свойство подписи, например так:

МенеджерКриптографии.АлгоритмПодписи = "SHA-1-RSA"; // Ошибка!

Такой подход неверен, так как встроенный механизм криптографии 1С (использующий Microsoft CryptoAPI на Windows) разделяет процесс создания подписи на два самостоятельных этапа:

  1. Хеширование данных: исходный файл «сворачивается» в короткую строку фиксированной длины (хеш-сумму). За это отвечает свойство АлгоритмХеширования.
  2. Шифрование хеш-суммы: полученный хеш зашифровывается закрытым ключом отправителя по алгоритму RSA. За это отвечает свойство АлгоритмПодписи.

Таким образом, алгоритм sha1RSA — это не единый алгоритм, а последовательное применение хеширования SHA-1 и подписи RSA. Попытка передать их совмещенное имя в одно свойство и вызывает ошибку платформы.

Решение 1. Правильная настройка встроенного Менеджера Криптографии 1С

Чтобы успешно подписать файл штатными средствами 1С, нам необходимо правильно разделить эти два параметра в коде. Для стандартного криптопровайдера от Microsoft алгоритмом подписи будет являться строка "RSA_SIGN", а алгоритмом хеширования — "SHA-1".

Рассмотрим рабочий пример кода:


// Инициализируем менеджер криптографии с базовым провайдером Microsoft
МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Base Cryptographic Provider v1.0", "", 1);

// Указываем алгоритм хеширования (SHA-1)
МенеджерКриптографии.АлгоритмХеширования = "SHA-1";

// Указываем алгоритм подписи (RSA)
МенеджерКриптографии.АлгоритмПодписи = "RSA_SIGN";

// Теперь менеджер готов к корректному подписанию файлов

Этот простой шаг полностью устраняет ошибку и позволяет корректно формировать подписи стандарта sha1RSA.

Как узнать точные названия поддерживаемых алгоритмов

В зависимости от версии операционной системы и установленных в системе криптопровайдеров (например, CryptoPro CSP, VipNet CSP или встроенные провайдеры Microsoft), строковые имена алгоритмов могут незначительно отличаться. Чтобы не угадывать их вручную, мы можем получить список всех доступных имён программно.

Разберем, как вывести список поддерживаемых алгоритмов в окно сообщений:


МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Base Cryptographic Provider v1.0", "", 1);
Информация = МенеджерКриптографии.ПолучитьИнформациюМодуляКриптографии();

Сообщить("--- ДОСТУПНЫЕ АЛГОРИТМЫ ПОДПИСИ ---");
Для Каждого Алгоритм Из Информация.АлгоритмыПодписи Цикл
    Сообщить(Алгоритм);
КонецЦикла;

Сообщить("--- ДОСТУПНЫЕ АЛГОРИТМЫ ХЕШИРОВАНИЯ ---");
Для Каждого Алгоритм Из Информация.АлгоритмыХеширования Цикл
    Сообщить(Алгоритм);
КонецЦикла;

Запустив этот код на выполнение, вы увидите точные строковые значения, которые гарантированно примет ваша операционная система.

Решение 2. Использование компонентов .NET (для ОС Windows)

Если встроенный класс МенеджерКриптографии накладывает ограничения (например, вам требуется получить подпись в специфическом бинарном формате без лишних метаданных), можно воспользоваться возможностями платформы .NET Framework напрямую через COM-объект. Это избавит вас от необходимости регистрировать устаревшие библиотеки вроде CAPICOM.

Проанализируем пример использования класса RSACryptoServiceProvider:


// Создаем объект криптопровайдера .NET
КрПровайдер = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");

// Пример загрузки параметров ключа (в формате XML)
// КрПровайдер.FromXmlString(СтрокаСКлючомXML);

// Преобразуем исходные данные в массив байт и хешируем их
// Для интеграции сложных алгоритмов используется метод SignData:
// SignatureBytes = КрПровайдер.SignData(ДанныеМассивБайт, "SHA1");

Данный способ обеспечивает очень высокую гибкость работы с ключами RSA, но требует понимания объектной модели .NET и работает только под управлением операционных систем Windows.

Решение 3. Кроссплатформенный вариант с утилитой OpenSSL

Если ваша база 1С работает на сервере под управлением ОС Linux (где нет Microsoft Cryptographic Provider), стандартные COM-объекты и встроенный Windows-провайдер работать не будут. В этом случае лучшим решением станет использование консольной утилиты OpenSSL, которая предустановлена практически на любом Linux-сервере и легко устанавливается на Windows.

Посмотрим на пошаговый алгоритм реализации этого метода:

  1. Выгружаем подписываемый файл во временный каталог на диске.
  2. Помещаем закрытый ключ (файл с расширением .pem или .key) во временный каталог (или используем фиксированный путь).
  3. Вызываем системную команду OpenSSL через функцию 1С ЗапуститьПриложение().
  4. Считываем полученный бинарный файл подписи обратно в 1С.

Рассмотрим пример кода для реализации этого сценария:


// Задаем пути к файлам
ПутьКДанным = ПолучитьИмяВременногоФайла("txt");
ПутьКПодписи = ПолучитьИмяВременногоФайла("bin");
ПутьККлючу = "/etc/ssl/certs/private_key.pem"; // Для Linux

// Записываем подписываемые данные во временный файл
ДанныеДляПодписи = "Тестовая строка для подписания";
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(ДанныеДляПодписи);
ТекстовыйФайл.Записать(ПутьКДанным, КодировкаТекста.UTF8);

// Формируем консольную команду для OpenSSL
// Команда производит хеширование SHA-1 и подписание ключом RSA
ШаблонКоманды = "openssl dgst -sha1 -sign ""%1"" -out ""%2"" ""%3""";
СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКоманды, ПутьККлючу, ПутьКПодписи, ПутьКДанным);

// Запускаем приложение в синхронном режиме (ожидаем завершения)
ЗапуститьПриложение(СтрокаКоманды, , Истина);

// Проверяем результат
ФайлПодписи = Новый Файл(ПутьКПодписи);
Если ФайлПодписи.Существует() Тогда
    ДвоичныеДанныеПодписи = Новый ДвоичныеДанные(ПутьКПодписи);
    Сообщить("Файл успешно подписан! Размер подписи: " + ДвоичныеДанныеПодписи.Размер() + " байт.");
Иначе
    ВызватьИсключение "Ошибка при генерации подписи с помощью OpenSSL.";
КонецЕсли;

Этот метод является абсолютно надежным, не зависит от настроек криптографии самой платформы 1С и отлично масштабируется на любых серверных архитектурах.

Важное примечание по безопасности (Переход с SHA-1 на SHA-256)

Обратите внимание, что алгоритм хеширования SHA-1 на сегодняшний день признан криптографически устаревшим и небезопасным (ввиду возможности коллизий). Большинство современных государственных и коммерческих систем отказываются от работы с ним.

Если у вас есть техническая возможность согласовать алгоритмы с принимающей стороной, настоятельно рекомендуем выполнить переход на более безопасный стандарт SHA-256 (соответственно, связка sha256RSA).

Для реализации SHA-256 на Windows стандартный базовый провайдер "Microsoft Base Cryptographic Provider v1.0" (тип 1) не подойдет. Вам потребуется переключить код на использование улучшенного AES-провайдера (тип 24):


// Используем тип провайдера 24 (PROV_RSA_AES) для поддержки SHA-256
МенеджерКриптографии = Новый МенеджерКриптографии(
    "Microsoft Enhanced RSA and AES Cryptographic Provider", 
    "", 
    24
);
МенеджерКриптографии.АлгоритмХеширования = "SHA-256";
МенеджерКриптографии.АлгоритмПодписи     = "RSA_SIGN";

Использование этого кода защитит вашу систему от будущих уязвимостей и обеспечит соответствие современным требованиям информационной безопасности.

← На главную