Как реализовать поддержку сертификатов ГОСТ Р 34.10-2012 в старых конфигурациях 1С и исправить ошибку 0x80090009

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

При работе со старыми, давно снятыми с поддержки конфигурациями 1С (такими как «Зарплата и кадры бюджетного учреждения 1.0», «Зарплата и управление персоналом 2.5», «Управление производственным предприятием 1.3») пользователи неизбежно сталкиваются с проблемой несовместимости с современными криптографическими стандартами. Наиболее острая проблема возникает при попытке использовать новые сертификаты электронных подписей, выпущенные по стандарту ГОСТ Р 34.10-2012, для взаимодействия с государственными органами, в частности, для получения электронных листков нетрудоспособности (ЭЛН) из Социального фонда России (СФР, бывший ФСС).

При попытке подписать или отправить запрос система выдает критическую ошибку: «Ошибка 0x80090009 (80090009). Указан неверный алгоритм. Не удалось подписать файл запроса ЭЛН». Выясним причину этой ошибки и разберем пошагово, как вернуть работоспособность обмена в старых конфигурациях без полного перехода на новые версии программ.

Почему возникает ошибка 0x80090009?

Системная ошибка CryptoAPI с кодом 0x80090009 (NTE_BAD_ALGID) буквально означает, что программное обеспечение передало криптопровайдеру идентификатор алгоритма (OID), который тот не смог распознать или применить в текущем контексте. В контексте старых конфигураций 1С эта проблема складывается из трех ключевых факторов:

  1. Устаревший код конфигурации. В программном коде жестко прописаны имена криптопровайдеров и алгоритмов хеширования/подписи, актуальные только для старого стандарта ГОСТ Р 34.10-2001.
  2. Жестко заданный тип провайдера (Provider Type). Для старого ГОСТ 2001 использовался тип провайдера 75, тогда как для ГОСТ 2012 требуется тип провайдера 80 (для ключей длины 256 бит) или 81 (для ключей длины 512 бит). Платформа или внешняя компонента пытается инициализировать контекст с типом 75, используя новый сертификат, что и приводит к ошибке.
  3. Устаревшая внешняя компонента шифрования (CryptS.dll). Для обмена с ФСС/СФР старые конфигурации используют внешнюю бинарную компоненту, которая физически «не знает» структуру пакетов подписи по новому ГОСТу.

Рассмотрим подробнее каждый этап исправления этой проблемы, от обновления платформы до модификации кода конфигурации и настройки операционной системы.

Шаг 1. Проверка версии платформы и режима совместимости

Прежде чем приступать к изменению программного кода, проанализируем системное окружение. Для полноценной поддержки криптографии ГОСТ Р 34.10-2012 на уровне платформы 1С нам потребуются определенные условия:

  1. Версия платформы 1С:Предприятие должна быть не ниже 8.3.12 (рекомендуется использовать актуальные версии веток 8.3.20, 8.3.22 и выше). Если перед переходом на новые версии платформы потребуется создать резервные копии баз и проверить их работу, этот процесс можно автоматизировать, задействовав инструмент для архивирования и тестирования 1С.
  2. В конфигураторе необходимо проверить свойство конфигурации «Режим совместимости». Если в конфигурации установлен слишком старый режим совместимости (например, 8.2.13 или ниже), некоторые встроенные механизмы работы с объектами криптографии (такие как МенеджерКриптографии) могут функционировать некорректно. По возможности режим совместимости следует поднять до актуального для вашей платформы уровня (хотя бы до 8.3.12), предварительно выполнив резервное копирование и протестировав стабильность работы базы данных.

Шаг 2. Программное добавление поддержки ГОСТ 2012 в справочник программ шифрования

В конфигурациях, где механизмы работы с электронными подписями построены на базе БСП (Библиотеки стандартных подсистем), за сопоставление криптопровайдеров отвечает справочник ПрограммыЭлектроннойПодписиИШифрования. В старых релизах этот справочник просто не имеет предопределенных настроек для работы с ГОСТ 2012.

Добавим поддержку нового алгоритма программно. Для этого нам необходимо открыть Конфигуратор, найти справочник ПрограммыЭлектроннойПодписиИШифрования, перейти в его Модуль Менеджера и в процедуру инициализации или заполнения настроек по умолчанию добавить инициализацию нового провайдера:


// Добавление поддержки КриптоПро CSP (ГОСТ 2012) в программный код
Настройка = Настройки.Добавить();
Настройка.Представление       = НСтр("ru = 'КриптоПро CSP (ГОСТ 2012)'");
Настройка.ИмяПрограммы        = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
Настройка.ТипПрограммы        = 80;
Настройка.АлгоритмПодписи     = "GR 34.10-2012 256";
Настройка.АлгоритмХеширования = "GR 34.11-2012 256";
Настройка.АлгоритмШифрования  = "GOST 28147-89";
Настройка.Идентификатор       = "CryptoPro2012";

Настройка.АлгоритмыПодписи.Добавить("GR 34.10-2012 256");
Настройка.АлгоритмыХеширования.Добавить("GR 34.11-2012 256");
Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89");

Этот код позволит системе корректно определять настройки шифрования при выборе в интерфейсе программы профиля криптографии, привязанного к ГОСТ 2012.

Шаг 3. Замена устаревшей внешней компоненты CryptS.dll

Даже после изменения справочника программ шифрования попытка загрузить ЭЛН может завершиться неудачей. Дело в том, что регламентированная отчетность и механизмы прямого обмена с ФСС в старых конфигурациях используют внешнюю компоненту AddIn.ЭДОNative.CryptS (файл CryptS.dll). Старая версия этой компоненты жестко завязана на вызовы библиотек Windows с параметрами ГОСТ 2001.

Для решения этой проблемы выполним следующие действия:

  1. Возьмем любую современную и обновленную конфигурацию 1С (например, демонстрационную или рабочую базу «Бухгалтерия предприятия 3.0» или «Зарплата и управление персоналом 3.1»).
  2. Через Конфигуратор новой базы найдем общий макет или макет обработки, содержащий компоненту обмена (обычно это макеты с именами вроде КомпонентаОбмена, CryptS или аналогичные в составе обработок документооборота с контролирующими органами).
  3. Сохраним этот макет на диск в виде двоичных данных (получим файл архива или саму библиотеку .dll).
  4. В нашей старой конфигурации (например, ЗКБУ 1.0) найдем аналогичный макет (часто он расположен внутри обработки ДокументооборотСКонтролирующимиОрганами или в общих макетах) и заменим его содержимое файлом, сохраненным из новой конфигурации.

После замены компоненты платформа 1С при следующем обращении к функциям подписи автоматически распакует и зарегистрирует в операционной системе обновленную версию библиотеки, умеющую корректно работать со спецификациями ГОСТ 2012.

Шаг 4. Устранение хардкода типов криптопровайдеров в модулях конфигурации

Проанализируем программный код модулей, отвечающих за отправку отчетности и получение ЭЛН. В конфигурациях уровня ЗУП 2.5 / ЗКБУ 1.0 параметры инициализации контекста провайдера очень часто прописаны непосредственно в коде (так называемый «хардкод»).

Нам необходимо запустить глобальный поиск по конфигурации (сочетание клавиш Ctrl + Shift + F) по значению 75 (числовой идентификатор типа провайдера ГОСТ 2001) и по строке "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider".

Особое внимание следует уделить общему модулю ДокументооборотСКонтролирующимиОрганами и модулям обработки РегламентированнаяОтчетность. В местах, где происходит создание объекта криптографии, добавим условие автоматического определения типа провайдера на основе анализа используемого сертификата:


// Корректировка выбора типа провайдера в зависимости от алгоритма сертификата
Если Найти(Врег(ИмяАлгоритмаСертификата), "2012") > 0 Тогда
    ТипПровайдера = 80; // ГОСТ Р 34.10-2012 (256 бит)
    ИмяПровайдера = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
Иначе
    ТипПровайдера = 75; // ГОСТ Р 34.10-2001
    ИмяПровайдера = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
КонецЕсли;

Если в коде используются вызовы методов внешней компоненты CryptS, убедимся, что параметры инициализации также принимают переменные значения, а не жестко заданные константы старого стандарта.

Шаг 5. Изменение адресов веб-сервисов СФР (ФСС)

После успешного подписания файла запроса на получение ЭЛН мы можем столкнуться с тем, что сервер ФСС не отвечает или возвращает ошибку соединения. Это связано с тем, что ФСС полностью прекратил поддержку старых шлюзов обмена версий 1.1 и изменил свои доменные имена в связи с объединением в Социальный фонд России (СФР).

В коде конфигурации (в модуле объекта обработки ДокументооборотСКонтролирующимиОрганами, функция СерверПриемаОтчетностиФССЭЛН или аналогичная) необходимо заменить устаревшие URL-адреса на новые рабочие эндпоинты СФР:

Шаг 6. Настройка реестра Windows для работы с КриптоПро (EnableOIDModify)

Иногда даже при полностью корректном коде 1С операционная система Windows (особенно устаревшие версии или серверные ОС Windows Server 2012/2016) может некорректно обрабатывать сопоставление криптографических идентификаторов объектов (OIDs) алгоритма ГОСТ 2012. Для принудительного включения корректного сопоставления OID в КриптоПро CSP выполним простую настройку системного реестра:

  1. Нажмите сочетание клавиш Win + R, введите regedit и нажмите Enter для запуска редактора реестра.
  2. Перейдите по следующему пути в зависимости от разрядности вашей операционной системы:
    • Для 64-битных ОС: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters
    • Для 32-битных ОС: HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters
  3. В указанном разделе кликните правой кнопкой мыши на свободном поле, выберите Создать -> Параметр DWORD (32 бита).
  4. Присвойте параметру имя EnableOIDModify.
  5. Дважды щелкните по созданному параметру и установите его значение равным 1 (в десятичной системе исчисления).
  6. Перезагрузите компьютер или службу криптографии для применения изменений.

Шаг 7. Правила размещения сертификатов в локальном хранилище

Для безошибочной работы криптографии в 1С критически важно правильно построить цепочку доверия сертификатов в операционной системе. Разберем, как правильно установить новые сертификаты ГОСТ 2012 через консоль сертификатов Windows или КриптоПро CSP:

  1. Корневой сертификат Головного удостоверяющего центра (ГЦУ Минцифры / Минкомсвязи), выпустившего ваш рабочий сертификат по стандарту ГОСТ 2012, должен быть обязательно установлен в локальное хранилище «Доверенные корневые центры сертификации» (Trusted Root Certification Authorities) локального компьютера. Без этого система не сможет проверить подлинность всей цепочки подписей.
  2. Сертификат СФР (ФСС), который используется для шифрования отправляемых файлов ЭЛН, должен быть установлен в хранилище «Другие пользователи» (Other People) текущего пользователя или локального компьютера. Обратите внимание: частая ошибка системных администраторов — установка сертификата ФСС в личное хранилище (Personal). Это приводит к тому, что компонента CryptS пытается найти для него закрытый ключ подписи (которого у вас, естественно, нет) и возвращает ошибку обращения к контейнеру ключей.
  3. Ваш личный сертификат организации должен быть установлен через КриптоПро CSP с автоматическим поиском и привязкой закрытого ключа в контейнере в хранилище «Личное» (Personal).

Выполнив все описанные шаги по модификации программного кода конфигурации 1С, замене устаревшей внешней компоненты шифрования на актуальную версию, а также настроив системный реестр и хранилище сертификатов Windows, мы полностью решим проблему совместимости со стандартом ГОСТ Р 34.10-2012. Наша старая конфигурация сможет беспрепятственно обмениваться данными с контролирующими органами и запрашивать электронные листки нетрудоспособности без необходимости дорогостоящего и экстренного обновления на новые редакции программных продуктов.

← На главную