Работа с электронной подписью на сервере 1С часто сопряжена с трудностями настройки окружения. Одна из самых распространенных ситуаций: вы настроили сертификаты, проверили их под своей учетной записью, но при попытке программного подписания через МенеджерКриптографии.Подписать() получаете ошибку «Отсутствует набор ключей» (или NTE_BAD_KEYSET). Давайте разберем подробно, почему сервер «не видит» закрытый ключ, хотя сертификат установлен, и как настроить систему правильно.
Когда мы выполняем код на сервере (или в фоновом задании), он исполняется в контексте той учетной записи, от имени которой запущена служба «Агент сервера 1С:Предприятия» (rphost) или веб-сервер (Apache/IIS), если используется файловая база через веб-публикацию.
Ошибка «Отсутствует набор ключей» означает, что криптопровайдер (обычно КриптоПро CSP) нашел сертификат (открытую часть), но не смог получить доступ к контейнеру закрытого ключа. Чаще всего проблема не в коде 1С, а в администрировании Windows и правах доступа.
Проанализируем основные причины и способы их решения по порядку.
Это самая частая причина. Давайте разберемся, как это работает.
Даже если вы настроили запуск службы сервера 1С от имени того же пользователя, под которым сидите (что не рекомендуется), существует понятие «Сессия 0». Службы работают в изолированной сессии, которая отличается от интерактивной сессии пользователя. Контейнеры ключей, установленные в реестр текущего пользователя (HKEY_CURRENT_USER), могут быть просто не видны службе.
Бесполезно проверять наличие ключей, просто зайдя на сервер. Нам нужно увидеть систему «глазами» службы сервера 1С. Для этого:
services.msc.Команда для запуска консоли управления сертификатами от имени системной учетной записи (если сервер 1С запущен под System):
psexec -i -s mmc
Если сервер 1С запущен под конкретным доменным или локальным пользователем:
psexec -i -u ИмяПользователя -p Пароль mmc
В открывшейся консоли добавьте оснастку «Сертификаты» -> «Моей учетной записи пользователя». Если там нет нужного сертификата или у него нет ссылки на закрытый ключ (иконка ключика на сертификате), значит, сервер 1С действительно не имеет доступа к ключу.
Если закрытый ключ находится на USB-токене (Rutoken, JaCarta), вставленном в сервер, служба может его не увидеть. Проброс USB-устройств в службу (Сессию 0) часто работает нестабильно или блокируется политиками безопасности. Также, если вы используете RDP, токен может «пробрасываться» с вашего локального компьютера, а сервер 1С ищет его в своих локальных портах.
Для серверного подписания настоятельно рекомендуется перенести ключи с физического носителя в реестр сервера. Сделаем это через панель управления КриптоПро CSP:
Важный нюанс: Если вы хотите, чтобы ключ был доступен любой службе на этом сервере, при копировании или установке лучше использовать хранилище «Реестр» -> «Локальный компьютер» (если такая опция доступна и позволяет политика безопасности). Однако чаще ключи ставят в реестр конкретного пользователя службы.
Даже если ключ скопирован в реестр, у пользователя USR1CV8 может не быть прав на чтение ветки реестра, где лежит контейнер. КриптоПро хранит ключи в ветках:
HKEY_CURRENT_USER\Software\Crypto Pro\Settings\Users\SID_Пользователя\KeysHKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\Keys (путь может отличаться в зависимости от разрядности ОС и версии КриптоПро).Бывает ситуация: сертификат есть в хранилище «Личное», файлы контейнера есть в реестре, но система не знает, что они связаны. При попытке вызвать МенеджерКриптографии.Подписать() система берет сертификат, пытается найти ссылку на контейнер и получает пустоту.
Самый надежный способ — переустановить сертификат через КриптоПро:
Альтернативный метод через командную строку (certutil). Найдите отпечаток сертификата и выполните команду под пользователем службы:
certutil -repairstore my "ОтпечатокСертификата"
Эта команда попытается найти соответствующий контейнер закрытого ключа и восстановить связь.
Сервер 1С (x64) не может загрузить 32-битные библиотеки криптографии, и наоборот. Если у вас установлен КриптоПро, убедитесь, что его компоненты соответствуют разрядности сервера 1С.
В настройках программы (в самой 1С), в разделе «Настройки электронной подписи и шифрования» -> «Программы», проверьте путь к модулю криптографии. Он должен вести к правильной DLL. Например, для 64-битного сервера путь часто выглядит так:
C:\Program Files\Crypto Pro\CSP\cprocspp.dll (или похожий путь в зависимости от версии).
Если путь ведет в Program Files (x86), а сервер 1С — 64-битный, подписание работать не будет.
Если вы столкнулись с ошибкой «Отсутствует набор ключей», выполните следующие шаги:
rphost.exe (или веб-сервер).psexec) и проверьте доступность контейнера через КриптоПро.Внимательно пройдя по этим пунктам, вы обеспечите доступность криптографических функций для серверных механизмов платформы 1С.