Как настроить подписание документов электронной подписью на сервере 1С и почему возникает ошибка при отсутствии сертификата на клиенте?

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

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

Архитектурное разделение слоев: криптопровайдер и Библиотека стандартных подсистем (БСП)

Чтобы понять логику работы платформы и конфигураций на базе БСП (1С:ЗУП, 1С:ERP, 1С:КА, 1С:БП), разделим процесс на два независимых слоя:

  1. Слой платформы и криптопровайдера (CSP). Отвечает за физическое хранение закрытого ключа и выполнение криптографических операций (хэширование, шифрование, формирование подписи). Опции «Подписывать на сервере» и «Проверять на сервере» определяют именно место выполнения математических вычислений — внутри процесса тонкого клиента (1cv8c.exe) или внутри рабочего процесса сервера 1С (rphost.exe).
  2. Слой пользовательского интерфейса БСП. Отвечает за предоставление пользователю списка доступных сертификатов. При интерактивной работе мастер добавления и форма выбора сертификата опрашивают локальное персональное хранилище сеанса пользователя. Поиск элемента выполняется по отпечатку (SHA-1 thumbprint). Если удалить сертификат из персонального хранилища Windows на клиенте, БСП просто не сможет сопоставить элемент справочника с объектом сертификата и прервет операцию еще до отправки команды подписания на сервер.

Следовательно, связь между клиентом и сервером работает по принципу логического «И» (AND): клиент отвечает за отображение и выбор сертификата, а сервер — за доступ к закрытому ключу и расчет подписи.

Диагностика серверного хранилища сертификатов программным кодом

Проанализируем состояние серверной криптографии с помощью встроенного языка 1С. Для этого выполним серверную процедуру во внешней обработке от имени обычного пользователя.

Для проверки списка сертификатов, которые видит процесс rphost, используем объект МенеджерКриптографии:


&НаСервере
Функция ПолучитьСертификатыСервера()
    // Для КриптоПро ГОСТ Р 34.10-2012 (256 бит) тип 80
    ИмяПровайдера = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
    ТипПровайдера = 80;
    
    Менеджер = Новый МенеджерКриптографии(ИмяПровайдера, "", ТипПровайдера);
    Хранилище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    
    Возврат Хранилище.ПолучитьВсе();
КонецФункции

Если вы используете методы подсистемы БСП, аналогичный опрос выполняется через вызовы общих модулей:


&НаСервере
Функция СертификатыНаСервереБСП()
    Если Не ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
    Если МенеджерКриптографии = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ХранилищеСертификатовКриптографии = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    МассивСертификатов = ХранилищеСертификатовКриптографии.ПолучитьВсе();
    
    СписокВозврата = Новый СписокЗначений;
    ТекущаяДата = ТекущаяДатаСеанса();
    
    Для Каждого Сертификат Из МассивСертификатов Цикл
        Если Сертификат.ДатаОкончания < ТекущаяДата Тогда
            Продолжить;
        КонецЕсли;
        
        ПредставлениеСертификата = ЭлектроннаяПодпись.ПредставлениеСертификата(Сертификат);
        ОтпечатокСертификата = Base64Строка(Сертификат.Отпечаток);
        СписокВозврата.Добавить(ОтпечатокСертификата, ПредставлениеСертификата);
    КонецЦикла;
    
    Возврат СписокВозврата;
КонецФункции

Тестирование доступности закрытого ключа на сервере

Обратите внимание: метод ПолучитьВсе() считывает только открытую часть сертификатов. Присутствие сертификата в списке не гарантирует, что сервер имеет доступ к его закрытому ключу. Чтобы проверить реальную возможность подписи, выполним тестовое вычисление на сервере:


&НаСервере
Функция ТестПодписанияНаСервере(Сертификат)
    МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
    Попытка
        ДанныеДляПодписи = ПолучитьДвоичныеДанныеИзСтроки("Тестовая строка проверки");
        Подпись = МенеджерКриптографии.Подписать(ДанныеДляПодписи, Сертификат);
        Возврат "Успешно. Размер подписи: " + Подпись.Размер() + " байт";
    Исключение
        Возврат "Ошибка подписания: " + ОписаниеОшибки();
    КонецПопытки;
КонецФункции

Пошаговая настройка совместного использования сертификата

Разберем правильный порядок действий для организации работы пользователей с серверным сертификатом без переноса закрытых ключей на рабочие станции:

  1. Установка закрытого ключа на сервере. Контейнер ключа устанавливается в реестр локального компьютера (Local Machine) либо в личное хранилище сервисной учетной записи, от имени которой запущена служба сервера 1С (обычно usr1cv8). Сервисному пользователю выдаются полные права на ветку реестра с ключами КриптоПро (HKLM\SOFTWARE\Crypto Pro\Settings\Users\<SID>\Keys).
  2. Экспорт открытой части сертификата. С сервера экспортируется только открытый сертификат в файл формата .cer (без закрытого ключа).
  3. Установка открытого сертификата на клиентские машины. Файл .cer импортируется в хранилище «Личное» (Personal) каждого пользователя тонкого клиента. Так как открытый ключ не содержит секретных данных, это безопасно и не требует лицензий криптопровайдера на локальных ПК при работе через сервер.
  4. Добавление сертификата в базу 1С. В справочнике «Сертификаты ключей электронной подписи и шифрования» сертификат добавляется либо выбором из установленных на клиенте, либо загрузкой из файла .cer.
  5. Сохранение пароля закрытого ключа. Служба сервера 1С работает в неинтерактивной нулевой сессии (Session 0) и не может отобразить окно ввода PIN-кода. В карточке сертификата в 1С необходимо обязательно сохранить пароль к закрытому ключу для автоматической передачи криптопровайдеру.

Особенности работы в сервисах «1С-Отчетность» и СЭДО СФР

Рассмотрим специфику взаимодействия с государственными органами в конфигурациях ЗУП и БП:

  1. 1С-Отчетность при интерактивной работе. Мастер настройки 1С-Отчетности рассчитан на работу с локальными хранилищами пользователя. Для привязки серверного сертификата перейдите в расширенные настройки учетной записи документооборота и укажите созданный ранее элемент справочника сертификатов вручную, избегая автоматического поиска по локальным устройствам.
  2. Регламентные задания и СЭДО СФР. Автоматическая отправка отчетности по расписанию, получение входящих требований и обмен сообщениями СЭДО (электронные больничные) выполняются на сервере в фоновом режиме без участия клиента. В этом сценарии задействуется исключительно серверный контейнер ключа.
  3. Использование МЧД и сертификатов физлиц. Согласно требованиям законодательства (63-ФЗ), передача закрытого ключа руководителя сотрудникам не рекомендуется. Оптимальным современным решением является выпуск индивидуальных сертификатов физических лиц на каждого кадровика или бухгалтера с регистрацией машиночитаемой доверенности (МЧД) в ФНС/СФР.
← На главную