При работе с электронной подписью в системе 1С:Предприятие часто возникает ситуация, когда подписание документов успешно проходит на стороне клиента, но завершается ошибкой при попытке выполнить ту же операцию на сервере (например, в фоновом задании или при вызове серверного метода). Особенно остро эта проблема проявляется в связке с аппаратными ключами Rutoken 2.0 и криптопровайдером КриптоПро CSP. Рассмотрим подробно, почему возникает ошибка «Набор ключей зарегистрирован недействительным» и как её устранить.
Типичная ситуация выглядит следующим образом: программный код, использующий метод МенеджерКриптографии.Подписать(), выдает исключение на сервере. В то же время интерактивное подписание через НачатьПодписывание() на клиенте работает без нареканий. Проанализируем технические вводные:
0x80090016).Разберем фундаментальную разницу в работе клиента и сервера. Когда вы запускаете 1С под своим пользователем, криптопровайдер работает в вашей интерактивной сессии и имеет доступ к USB-портам и смарт-картам. Сервер 1С (процесс rphost.exe) обычно запущен как служба от имени системной учетной записи или специального пользователя. Этот процесс живет в так называемой «Сессии 0», которая изолирована от графического интерфейса и часто не имеет прямого доступа к аппаратным токенам.
Проанализируем основные факторы, блокирующие работу:
1C:Enterprise 8.3 Server Agent, может не иметь прав на обращение к оборудованию или к веткам реестра, где хранятся настройки криптопровайдера.Рассмотрим диагностический метод, который позволяет подтвердить проблему прав. Попробуем войти в операционную систему сервера под той же учетной записью, от имени которой запущена служба сервера 1С. После входа запустим 1С в режиме толстого или тонкого клиента и попробуем выполнить подписание. Если подписание не проходит даже в интерактивном режиме под этой учеткой — проблема в правах доступа к контейнеру или в отсутствии установленного сертификата в хранилище Личное для данного пользователя.
Для того чтобы служба rphost могла взаимодействовать с Rutoken, необходимо убедиться, что служба ОС «Смарт-карта» (Smart Card) запущена и работает корректно. Рассмотрим дополнительные настройки в КриптоПро CSP:
Также важно проверить разрешения на папку с ключами. Даже для аппаратного токена КриптоПро может создавать временные файлы. Проверим наличие прав Полный доступ для пользователя службы 1С на папку: C:\ProgramData\Crypto Pro\.
Если аппаратный ключ Rutoken 2.0 и специфика операционной системы (особенно устаревшей Windows Server 2008 R2) не позволяют добиться стабильной работы в сессии 0, рассмотрим наиболее надежный практический выход — использование программного контейнера.
Суть метода заключается в том, чтобы перенести закрытый ключ из аппаратного устройства в реестр сервера или в файл (PFX-контейнер). Однако стоит помнить, что ключи на Rutoken 2.0 часто генерируются как неизвлекаемые. Посмотрим на алгоритм действий в этом случае:
Компьютер, а не Пользователь, чтобы служба сервера 1С имела к нему доступ).Рассмотрим, как должен выглядеть код для серверного подписания, чтобы минимизировать ошибки интерфейса. Обязательно используем блоки Попытка...Исключение для логирования детальных ошибок. Для быстрой проверки настроек криптографии или в качестве альтернативы самостоятельному написанию кода можно использовать обработку для подписи произвольных файлов.
// Пример серверного метода для подписания данных
Функция ПодписатьДанныеНаСервере(ДанныеДляПодписи, ОтпечатокСертификата) Экспорт
// Инициализируем менеджер криптографии
// Указываем имя и тип провайдера явно, если используются специфические настройки
ИмяПровайдера = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
ТипПровайдера = 80; // Для ГОСТ 2012
Менеджер = Новый МенеджерКриптографии(ИмяПровайдера, "", ТипПровайдера);
// Поиск сертификата в хранилище "Личное" локального компьютера
// Важно: на сервере сертификат должен быть установлен в хранилище Local Machine
Сертификат = Менеджер.СнарядитьСертификатПоОтпечатку(ОтпечатокСертификата);
Попытка
Результат = Менеджер.Подписать(ДанныеДляПодписи, Сертификат);
Возврат Результат;
Исключение
// Записываем детальную ошибку в Журнал Регистрации
ТекстОшибки = ИнформацияОбОшибке().Описание;
ЗаписьЖурналаРегистрации("Криптография", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при подписании на сервере: " + ТекстОшибки);
ВызватьИсключение "Не удалось подписать документ на сервере. Обратитесь к администратору.";
КонецПопытки;
КонецФункции
Проанализировав ситуацию, мы видим, что ошибка «Набор ключей зарегистрирован недействительным» чаще всего является следствием несовместимости контекста службы и аппаратного токена. Если стандартные методы настройки прав и проброса USB-устройств в виртуальную среду не помогают, наиболее эффективным решением будет переход на программный контейнер. Это исключает зависимость от физического устройства, исключает проблемы с «засыпанием» USB-портов и гарантирует стабильную работу фоновых заданий 1С.
Рекомендации:
USB Device, а не через общие протоколы смарт-карт.