Ошибка «Отсутствует набор ключей» при подписании на сервере 1С: почему возникает и как исправить?

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

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

Суть проблемы

Когда мы выполняем код на сервере (или в фоновом задании), он исполняется в контексте той учетной записи, от имени которой запущена служба «Агент сервера 1С:Предприятия» (rphost) или веб-сервер (Apache/IIS), если используется файловая база через веб-публикацию.

Ошибка «Отсутствует набор ключей» означает, что криптопровайдер (обычно КриптоПро CSP) нашел сертификат (открытую часть), но не смог получить доступ к контейнеру закрытого ключа. Чаще всего проблема не в коде 1С, а в администрировании Windows и правах доступа.

Проанализируем основные причины и способы их решения по порядку.

Причина 1: Разные контексты пользователя (Проблема «Сессии 0»)

Это самая частая причина. Давайте разберемся, как это работает.

  1. Вы заходите на сервер по RDP под пользователем Admin.
  2. Запускаете КриптоПро, видите сертификат и закрытый ключ. Все тесты проходят успешно.
  3. Сервер 1С запущен под пользователем USR1CV8.
  4. Когда 1С пытается обратиться к криптографии, она ищет ключи в профиле USR1CV8, а не Admin.

Даже если вы настроили запуск службы сервера 1С от имени того же пользователя, под которым сидите (что не рекомендуется), существует понятие «Сессия 0». Службы работают в изолированной сессии, которая отличается от интерактивной сессии пользователя. Контейнеры ключей, установленные в реестр текущего пользователя (HKEY_CURRENT_USER), могут быть просто не видны службе.

Решение: Честная проверка видимости ключа

Бесполезно проверять наличие ключей, просто зайдя на сервер. Нам нужно увидеть систему «глазами» службы сервера 1С. Для этого:

  1. Выясните, под какой учетной записью работает служба «Агент сервера 1С» (или Apache/IIS). Посмотрим это в оснастке services.msc.
  2. Используйте утилиту PsExec (из пакета Sysinternals) для запуска командной строки от имени этой службы.

Команда для запуска консоли управления сертификатами от имени системной учетной записи (если сервер 1С запущен под System):

psexec -i -s mmc

Если сервер 1С запущен под конкретным доменным или локальным пользователем:

psexec -i -u ИмяПользователя -p Пароль mmc

В открывшейся консоли добавьте оснастку «Сертификаты» -> «Моей учетной записи пользователя». Если там нет нужного сертификата или у него нет ссылки на закрытый ключ (иконка ключика на сертификате), значит, сервер 1С действительно не имеет доступа к ключу.

Причина 2: Физическое расположение ключа (Токен vs Реестр)

Если закрытый ключ находится на USB-токене (Rutoken, JaCarta), вставленном в сервер, служба может его не увидеть. Проброс USB-устройств в службу (Сессию 0) часто работает нестабильно или блокируется политиками безопасности. Также, если вы используете RDP, токен может «пробрасываться» с вашего локального компьютера, а сервер 1С ищет его в своих локальных портах.

Решение: Копирование в реестр

Для серверного подписания настоятельно рекомендуется перенести ключи с физического носителя в реестр сервера. Сделаем это через панель управления КриптоПро CSP:

  1. Зайдите на сервер под пользователем, от которого работает служба 1С (или под администратором, если планируете ставить в общее хранилище).
  2. Откройте КриптоПро CSP -> вкладка «Сервис» -> «Скопировать».
  3. Выберите контейнер на токене.
  4. В качестве носителя для копии выберите «Реестр».

Важный нюанс: Если вы хотите, чтобы ключ был доступен любой службе на этом сервере, при копировании или установке лучше использовать хранилище «Реестр» -> «Локальный компьютер» (если такая опция доступна и позволяет политика безопасности). Однако чаще ключи ставят в реестр конкретного пользователя службы.

Причина 3: Права доступа к веткам реестра

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

Решение: Настройка прав

  1. Откройте редактор реестра (regedit).
  2. Найдите ветку с ключами.
  3. Нажмите правой кнопкой -> «Разрешения» (Permissions).
  4. Убедитесь, что учетная запись, под которой работает сервер 1С, имеет права «Полный доступ» (Full Control) или как минимум «Чтение» к этой ветке.

Причина 4: Потеряна связь сертификата с закрытым ключом

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

Решение: Переустановка или Repair

Самый надежный способ — переустановить сертификат через КриптоПро:

  1. Вкладка «Сервис» -> «Просмотреть сертификаты в контейнере».
  2. Выбираем контейнер (желательно тот, что в Реестре).
  3. Если сертификат найден, жмем «Установить». Это принудительно пропишет связь (Link) в хранилище сертификатов Windows.

Альтернативный метод через командную строку (certutil). Найдите отпечаток сертификата и выполните команду под пользователем службы:

certutil -repairstore my "ОтпечатокСертификата"

Эта команда попытается найти соответствующий контейнер закрытого ключа и восстановить связь.

Причина 5: Разрядность приложений

Сервер 1С (x64) не может загрузить 32-битные библиотеки криптографии, и наоборот. Если у вас установлен КриптоПро, убедитесь, что его компоненты соответствуют разрядности сервера 1С.

В настройках программы (в самой 1С), в разделе «Настройки электронной подписи и шифрования» -> «Программы», проверьте путь к модулю криптографии. Он должен вести к правильной DLL. Например, для 64-битного сервера путь часто выглядит так:

C:\Program Files\Crypto Pro\CSP\cprocspp.dll (или похожий путь в зависимости от версии).

Если путь ведет в Program Files (x86), а сервер 1С — 64-битный, подписание работать не будет.

Итоговый алгоритм действий

Если вы столкнулись с ошибкой «Отсутствует набор ключей», выполните следующие шаги:

  1. Определите пользователя, под которым работает процесс rphost.exe (или веб-сервер).
  2. Убедитесь, что закрытый ключ находится в Реестре, а не на токене.
  3. Зайдите в Windows под пользователем службы (или используйте psexec) и проверьте доступность контейнера через КриптоПро.
  4. Переустановите сертификат через меню «Просмотреть сертификаты в контейнере» -> «Установить», чтобы восстановить привязку.
  5. Проверьте права доступа пользователя службы к ветке реестра с ключами.

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

← На главную