Как решить проблему с подписанием КЭП на сервере 1С при использовании Rutoken 2.0?

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

При работе с электронной подписью в системе 1С:Предприятие часто возникает ситуация, когда подписание документов успешно проходит на стороне клиента, но завершается ошибкой при попытке выполнить ту же операцию на сервере (например, в фоновом задании или при вызове серверного метода). Особенно остро эта проблема проявляется в связке с аппаратными ключами Rutoken 2.0 и криптопровайдером КриптоПро CSP. Рассмотрим подробно, почему возникает ошибка «Набор ключей зарегистрирован недействительным» и как её устранить.

Анализируем симптомы и контекст ошибки

Типичная ситуация выглядит следующим образом: программный код, использующий метод МенеджерКриптографии.Подписать(), выдает исключение на сервере. В то же время интерактивное подписание через НачатьПодписывание() на клиенте работает без нареканий. Проанализируем технические вводные:

Выясняем причину: почему сервер «не видит» ключ?

Разберем фундаментальную разницу в работе клиента и сервера. Когда вы запускаете 1С под своим пользователем, криптопровайдер работает в вашей интерактивной сессии и имеет доступ к USB-портам и смарт-картам. Сервер 1С (процесс rphost.exe) обычно запущен как служба от имени системной учетной записи или специального пользователя. Этот процесс живет в так называемой «Сессии 0», которая изолирована от графического интерфейса и часто не имеет прямого доступа к аппаратным токенам.

Проанализируем основные факторы, блокирующие работу:

  1. Изоляция сессий: Смарт-карты и токены по умолчанию могут быть «невидимы» для процессов, запущенных не интерактивно. Иногда ситуацию осложняют спящие сеансы 1С, блокирующие доступ к ресурсам.
  2. Права доступа: Учетная запись, от которой работает служба 1C:Enterprise 8.3 Server Agent, может не иметь прав на обращение к оборудованию или к веткам реестра, где хранятся настройки криптопровайдера.
  3. Тип лицензии КриптоПро: Для работы криптографии в серверных процессах (фоновые задания, веб-сервисы) требуется серверная лицензия КриптоПро CSP. Обычная клиентская лицензия может блокировать вызовы из служб.
  4. Особенности Rutoken 2.0: Это устройство с неизвлекаемыми ключами. Криптографические операции происходят внутри самого чипа, что накладывает дополнительные ограничения на передачу контекста ключа между сессиями ОС.

Шаг 1. Проверка работы под учетной записью службы

Рассмотрим диагностический метод, который позволяет подтвердить проблему прав. Попробуем войти в операционную систему сервера под той же учетной записью, от имени которой запущена служба сервера 1С. После входа запустим 1С в режиме толстого или тонкого клиента и попробуем выполнить подписание. Если подписание не проходит даже в интерактивном режиме под этой учеткой — проблема в правах доступа к контейнеру или в отсутствии установленного сертификата в хранилище Личное для данного пользователя.

Шаг 2. Настройка доступа к смарт-картам для служб

Для того чтобы служба rphost могла взаимодействовать с Rutoken, необходимо убедиться, что служба ОС «Смарт-карта» (Smart Card) запущена и работает корректно. Рассмотрим дополнительные настройки в КриптоПро CSP:

  1. Откроем панель КриптоПро CSP от имени администратора.
  2. Перейдем на вкладку «Оборудование» и нажмем «Настроить типы носителей».
  3. Убедимся, что Rutoken активен.
  4. Проанализируем вкладку «Безопасность»: в некоторых версиях требуется установить флаг «Использовать службу хранения ключей» или разрешить запуск в контексте сервисов.

Также важно проверить разрешения на папку с ключами. Даже для аппаратного токена КриптоПро может создавать временные файлы. Проверим наличие прав Полный доступ для пользователя службы 1С на папку: C:\ProgramData\Crypto Pro\.

Шаг 3. Решение проблемы через программный контейнер (экспорт ключа)

Если аппаратный ключ Rutoken 2.0 и специфика операционной системы (особенно устаревшей Windows Server 2008 R2) не позволяют добиться стабильной работы в сессии 0, рассмотрим наиболее надежный практический выход — использование программного контейнера.

Суть метода заключается в том, чтобы перенести закрытый ключ из аппаратного устройства в реестр сервера или в файл (PFX-контейнер). Однако стоит помнить, что ключи на Rutoken 2.0 часто генерируются как неизвлекаемые. Посмотрим на алгоритм действий в этом случае:

  1. Проверим через «Панель управления Рутокен», помечен ли сертификат как экспортируемый.
  2. Если экспорт разрешен, средствами КриптоПро скопируем контейнер в «Реестр» (выбирая при копировании область Компьютер, а не Пользователь, чтобы служба сервера 1С имела к нему доступ).
  3. Если ключ неизвлекаемый (стандарт ФНС), проанализируем возможность перевыпуска сертификата. Как показывает практика, перевыпуск сертификата в виде файлового контейнера через удостоверяющий центр полностью снимает проблему «невидимости» токена на сервере.

Пример программной реализации подписания на сервере

Рассмотрим, как должен выглядеть код для серверного подписания, чтобы минимизировать ошибки интерфейса. Обязательно используем блоки Попытка...Исключение для логирования детальных ошибок. Для быстрой проверки настроек криптографии или в качестве альтернативы самостоятельному написанию кода можно использовать обработку для подписи произвольных файлов.


// Пример серверного метода для подписания данных
Функция ПодписатьДанныеНаСервере(ДанныеДляПодписи, ОтпечатокСертификата) Экспорт
    
    // Инициализируем менеджер криптографии
    // Указываем имя и тип провайдера явно, если используются специфические настройки
    ИмяПровайдера = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
    ТипПровайдера = 80; // Для ГОСТ 2012
    
    Менеджер = Новый МенеджерКриптографии(ИмяПровайдера, "", ТипПровайдера);
    
    // Поиск сертификата в хранилище "Личное" локального компьютера
    // Важно: на сервере сертификат должен быть установлен в хранилище Local Machine
    Сертификат = Менеджер.СнарядитьСертификатПоОтпечатку(ОтпечатокСертификата);
    
    Попытка
        Результат = Менеджер.Подписать(ДанныеДляПодписи, Сертификат);
        Возврат Результат;
    Исключение
        // Записываем детальную ошибку в Журнал Регистрации
        ТекстОшибки = ИнформацияОбОшибке().Описание;
        ЗаписьЖурналаРегистрации("Криптография", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка при подписании на сервере: " + ТекстОшибки);
        ВызватьИсключение "Не удалось подписать документ на сервере. Обратитесь к администратору.";
    КонецПопытки;
    
КонецФункции

Подведем итоги

Проанализировав ситуацию, мы видим, что ошибка «Набор ключей зарегистрирован недействительным» чаще всего является следствием несовместимости контекста службы и аппаратного токена. Если стандартные методы настройки прав и проброса USB-устройств в виртуальную среду не помогают, наиболее эффективным решением будет переход на программный контейнер. Это исключает зависимость от физического устройства, исключает проблемы с «засыпанием» USB-портов и гарантирует стабильную работу фоновых заданий 1С.

Рекомендации:

  1. Всегда проверяйте наличие серверной лицензии КриптоПро при работе на стороне сервера 1С.
  2. Устанавливайте корневые сертификаты УЦ в хранилище «Доверенные корневые центры сертификации» именно локального компьютера (Local Machine), а не только текущего пользователя.
  3. При использовании виртуализации ESXi, пробрасывайте токен как USB Device, а не через общие протоколы смарт-карт.
  4. Если безопасность позволяет, используйте контейнеры в реестре с паролем, сохраненным в системе, для автоматизации подписания в фоновых режимах.
← На главную