Почему 1С не видит установленный сертификат в Личном хранилище на сервере?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При работе с внешними сервисами, такими как ФГИС "Зерно", часто возникает необходимость использования электронной подписи — для этого подойдёт готовая интеграция 1С с ФГИС Зерно через API. В 1С:Предприятие для этого применяется модуль криптографии, например, КриптоПро CSP. Однако пользователи нередко сталкиваются с ситуацией, когда, несмотря на корректную установку сертификата в систему, серверный код 1С не может его обнаружить. Давайте разберем эту проблему на примере и предложим комплексное решение.

Рассмотрим типовую ситуацию: вы успешно использовали сертификат, когда настраивалась реализация обмена с ФГИС "Зерно", но после его продления и переустановки 1С перестала его "видеть". При этом стандартные средства Windows и утилиты КриптоПро CSP показывают, что сертификат установлен и доступен.

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


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

В такой ситуации отладка показывает, что вызов лХранилищеСертификатов.НайтиПоОтпечатку() возвращает Неопределено, а при просмотре всех сертификатов через лХранилищеСертификатов.ПолучитьВсе() новый сертификат отсутствует, хотя старый, возможно, все еще виден.

Эта проблема, как правило, сводится к двум основным причинам: местонахождение сертификата в хранилище и права доступа к закрытому ключу для учетной записи, под которой работает сервер 1С:Предприятия. Если вам необходимы более сложные алгоритмы шифрования ГОСТ 34.10-2012 или работа без COM-объектов, стоит изучить альтернативные реализации, но для стандартного модуля КриптоПро причины остаются прежними — для подписания без настройки криптографии на сервере есть интеграция 1С с сервисом Госключ. Давайте разберем эти аспекты подробнее.

Причина 1: Неправильное расположение сертификата

Операционная система Windows поддерживает несколько типов хранилищ сертификатов, ключевыми из которых для нас являются:

  1. Хранилище текущего пользователя (Current User): Содержит сертификаты, доступные только для той учетной записи, под которой пользователь интерактивно вошел в систему. Если вы вошли на сервер под учетной записью администратора и установили сертификат, то он попадет именно сюда.
  2. Хранилище локального компьютера (Local Machine): Содержит сертификаты, доступные для всех пользователей на данном компьютере, а также для системных служб и процессов, запущенных от имени системных учетных записей. Это критически важно для серверных приложений.

Сервер 1С:Предприятия (процесс ragent.exe, или Агент сервера 1С) обычно запускается как служба от имени специально выделенной учетной записи (например, USR1CV8, Network Service, Local System или другой пользователь, настроенный администратором). Эта учетная запись не является интерактивным пользователем, вошедшим в систему. Следовательно, она не имеет доступа к хранилищу "Личные" текущего пользователя.

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

Решение 1: Правильная установка сертификата в хранилище локального компьютера

Чтобы установить сертификат в хранилище локального компьютера, выполните следующие шаги:

  1. Откройте консоль управления Microsoft (MMC): нажмите Win + R, введите mmc и нажмите Enter.
  2. В консоли выберите Файл -> Добавить или удалить оснастку....
  3. В списке доступных оснасток найдите Сертификаты, выделите ее и нажмите Добавить.
  4. В появившемся диалоговом окне выберите учетной записи компьютера и нажмите Далее.
  5. Оставьте выбранным Локальный компьютер и нажмите Готово.
  6. Нажмите ОК, чтобы закрыть окно добавления оснастки.
  7. В консоли MMC разверните Сертификаты (локальный компьютер) -> Личные -> Сертификаты.
  8. Щелкните правой кнопкой мыши по папке Сертификаты, выберите Все задачи -> Импорт....
  9. Следуйте инструкциям мастера импорта сертификатов, указывая путь к файлу вашего сертификата (обычно с расширением .pfx или .cer) и пароль к закрытому ключу, если он есть. Убедитесь, что вы импортируете закрытый ключ вместе с сертификатом.
  10. После импорта убедитесь, что сертификат появился в списке.

В коде 1С мы также можем явно указать, какое хранилище использовать. Метод МенеджерКриптографии.ПолучитьХранилищеСертификатов имеет необязательный параметр РасположениеХранилищаСертификатовКриптографии. По умолчанию он использует ДанныеПользователяОС. Для доступа к хранилищу локального компьютера мы должны передать другое значение:


лХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(, РасположениеХранилищаСертификатовКриптографии.ДанныеЛокальногоКомпьютера);

Использование этого параметра критически важно для серверных сценариев.

Причина 2: Недостаточные права доступа к закрытому ключу

Даже если сертификат установлен в правильное хранилище локального компьютера, сервер 1С может его не видеть или не использовать, если у учетной записи службы сервера нет прав на доступ к его закрытому ключу. Если в вашей компании требования к безопасности повышены, возможно, вы уже используете хранение секретов в Hashicorp Vault для 1С, однако права на уровне ОС для криптопровайдера все равно необходимо настроить вручную.

Учетная запись, под которой работает служба Агента сервера 1С, должна иметь явные права на чтение закрытого ключа сертификата. Если эти права не настроены, попытка подписания завершится ошибкой или сертификат не будет найден, так как фактически он недоступен для использования.

Решение 2: Предоставление прав доступа к закрытому ключу для учетной записи службы 1С

Давайте пошагово рассмотрим, как предоставить необходимые права:

  1. Определите учетную запись службы 1С:
    • На сервере откройте Диспетчер задач.
    • Перейдите на вкладку Службы.
    • Найдите службу Агент сервера 1С:Предприятия (обычно начинается с 1C:Enterprise 8...).
    • Щелкните по ней правой кнопкой мыши и выберите Свойства.
    • Перейдите на вкладку Вход в систему. Здесь будет указана учетная запись, под которой запускается служба (например, Local System account, Network Service или конкретный пользователь, такой как .\USR1CV8). Запомните это имя.
  2. Предоставьте права доступа к закрытому ключу:
    • Снова откройте консоль управления Microsoft (MMC) с оснасткой Сертификаты (локальный компьютер), как описано выше.
    • Разверните Сертификаты (локальный компьютер) -> Личные -> Сертификаты.
    • Найдите нужный сертификат в списке.
    • Щелкните по сертификату правой кнопкой мыши, выберите Все задачи -> Управление закрытыми ключами....
    • В открывшемся окне Разрешения нажмите кнопку Добавить....
    • Введите имя учетной записи, под которой работает служба 1С (например, USR1CV8, Network Service). Если это встроенная учетная запись, убедитесь, что выбрали правильный тип объектов для поиска.
    • Нажмите Проверить имена, чтобы убедиться, что учетная запись найдена.
    • Нажмите ОК.
    • В списке разрешений выделите добавленную учетную запись и установите флажок Чтение в колонке Разрешить. Для серверных процессов обычно достаточно прав на чтение закрытого ключа.
    • Нажмите Применить, затем ОК.

После изменения прав доступа обязательно перезапустите службу Агента сервера 1С:Предприятия, чтобы изменения вступили в силу. Это можно сделать через консоль "Службы" Windows или "Диспетчер задач".

Дополнительные аспекты и проверка

  1. Срок действия и статус сертификата: Всегда проверяйте, что сертификат действителен и не отозван. Утилиты КриптоПро CSP, такие как certmgr.msc или cpverify.exe, помогут в этом.
  2. Лицензия КриптоПро CSP: Убедитесь, что на сервере установлена действующая лицензия на КриптоПро CSP, подходящая для серверной операционной системы. Отсутствие или неверная лицензия может привести к ошибкам инициализации криптопровайдера.
  3. Логи КриптоПро CSP и 1С: Если проблема сохраняется, внимательно изучите журналы событий Windows (раздел "Приложения" и "Система"), а также технологический журнал 1С:Предприятия. Там могут быть более детальные сообщения об ошибках.
  4. Автоматизация обмена: Если вам требуется не только подписывать отдельные запросы, но и массово передавать данные, может пригодиться универсальная выгрузка – загрузка документов, справочников и регистров с возможностью шифрования.

Итак, основное решение проблемы заключалось в сочетании двух факторов:

  1. Корректная установка сертификата в хранилище "Личные" для локального компьютера.
  2. Настройка прав доступа на чтение закрытого ключа для учетной записи, под которой работает служба Агента сервера 1С:Предприятия.

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

← На главную