Как программно авторизоваться в СБИС через внешнюю обработку 1С с использованием сертификата?

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

При разработке механизмов автоматизации электронного документооборота (ЭДО) через СБИС (Тензор) программисты часто сталкиваются с необходимостью использовать официальную внешнюю обработку Sbis1C.epf. Одной из самых распространенных проблем при этом является ошибка "Сертификат не найден" в момент вызова метода авторизации, даже если сам файл сертификата корректно считывается из файловой системы. Рассмотрим подробно, как правильно настроить параметры авторизации и подготовить данные для успешного входа в систему.

Анализ исходной ситуации

Часто разработчики пытаются передать в структуру параметров авторизации полный текст сертификата, выгруженный в формате PEM (между тегами -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----). Рассмотрим пример кода, который обычно приводит к ошибке:


// Создаем объект внешней обработки
ВО = ВнешниеОбработки.Создать("d:\Temp\Sbis1C.epf");
ВИ = ВО.ПолучитьФорму("ВнешнийИнтерфейс");
Кэш = ВИ.сбисИнициализировать();

// Пытаемся передать тело сертификата как текст
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("d:\Temp\certificate.txt");
ТекстСертификат = Текст.ПолучитьТекст();

ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("ВходПоСертификату", Истина);
ПараметрыАвторизации.Вставить("Сертификат", ТекстСертификат); // Здесь возникает ошибка
ЗапускРоботом = Истина;

УспешнаяАвторизация = ВИ.сбисАвторизация(Кэш, ПараметрыАвторизации, ЗапускРоботом);

В данной ситуации система возвращает ошибку, так как метод сбисАвторизация ожидает не тело сертификата, а его уникальный идентификатор в системе — отпечаток (Thumbprint).

Разберем причину ошибки и правильный подход

Проанализируем работу внутренней логики СБИС. Обработка Sbis1C.epf не выполняет криптографические операции самостоятельно «из файла». Она обращается к установленному в операционной системе криптопровайдеру (КриптоПро CSP или VipNet CSP) и ищет сертификат в системном хранилище (обычно в ветке «Личные»). Чтобы поиск прошел успешно, необходимо предоставить системе хэш SHA-1 этого сертификата.

Ключевые требования к передаваемому значению:

  1. Должен передаваться именно отпечаток (40 шестнадцатеричных символов).
  2. Строка отпечатка не должна содержать пробелов.
  3. Все символы строки должны быть в ВЕРХНЕМ регистре.

Пошаговое решение проблемы

Рассмотрим, как правильно подготовить строку отпечатка и передать её в обработку СБИС. Если вы копируете отпечаток из свойств сертификата в Windows, он часто содержит невидимые символы или пробелы между парами цифр. Нам нужно их удалить и привести строку к нужному виду.


// Исходный отпечаток, скопированный из свойств сертификата
ОтпечатокИзСвойств = "a1 b2 c3 d4 e5 f6 78 90 g1 g2 g3 g4 g5 g6 g7 g8 g9 g0 a2 b2";

// Очищаем строку от пробелов и переводим в верхний регистр
ЧистыйОтпечаток = СтрЗаменить(ОтпечатокИзСвойств, " ", "");
ЧистыйОтпечаток = ВРег(ЧистыйОтпечаток);

// Теперь формируем параметры для авторизации
ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("ИдентификаторСессии", "");
ПараметрыАвторизации.Вставить("ВходПоСертификату", Истина);
ПараметрыАвторизации.Вставить("Сертификат", ЧистыйОтпечаток); // Передаем очищенный отпечаток
ПараметрыАвторизации.Вставить("Логин", "");
ПараметрыАвторизации.Вставить("Пароль", "");

ЗапускРоботом = Истина; // Режим без вывода диалоговых окон

УспешнаяАвторизация = ВИ.сбисАвторизация(Кэш, ПараметрыАвторизации, ЗапускРоботом);

Если УспешнаяАвторизация Тогда
    Сообщить("Авторизация прошла успешно!");
Иначе
    Сообщить("Ошибка авторизации. Проверьте наличие сертификата в хранилище.");
КонецЕсли;

Важные технические нюансы работы с криптографией

Проанализируем ситуацию, если даже с корректным отпечатком система продолжает выдавать ошибку. Выясним возможные причины:

  1. Наличие закрытого ключа: Для авторизации в СБИС недостаточно просто иметь установленный сертификат (открытый ключ). В системе должен быть установлен соответствующий контейнер закрытого ключа. Если сертификат установлен без привязки к ключу, криптопровайдер не сможет подписать запрос на авторизацию.
  2. Разрядность приложения: Если вы используете 64-битную версию платформы 1С, убедитесь, что ваш криптопровайдер (например, КриптоПро) также корректно работает с 64-битными приложениями. Иногда внешние компоненты, используемые в Sbis1C.epf, требуют запуска 1С в 32-битном режиме.
  3. Режим «ЗапускРоботом»: Когда мы устанавливаем ЗапускРоботом = Истина, обработка подавляет все окна, включая запрос PIN-кода контейнера. Если на ваш закрытый ключ установлен пароль, он должен быть либо сохранен в системе (галочка «Запомнить пароль» в КриптоПро), либо вы должны использовать интерактивный режим (ЗапускРоботом = Ложь), чтобы пользователь мог ввести пароль вручную.
  4. Права доступа: Пользователь ОС, под которым запущен сервер 1С (если код выполняется на стороне сервера) или клиентское приложение, должен иметь права на чтение веток реестра, где хранятся настройки криптопровайдера и информация о сертификатах.

Дополнительные рекомендации по работе с Base64

В некоторых случаях (например, при прямом обращении к JSON-RPC API СБИС в обход внешней обработки) может потребоваться передача самого тела сертификата. В 1С для этого следует использовать преобразование двоичных данных в строку Base64. Рассмотрим этот пример на случай расширения функционала вашей обработки:


// Пример получения Base64 строки из файла сертификата
ПутьКФайлу = "C:\Certs\mycert.cer";
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаBase64 = Base64Строка(ДвоичныеДанные);

// Важно: иногда требуется удалить символы переноса строк
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");

Однако помните, что для стандартного метода сбисАвторизация во внешней обработке 1С приоритетным и рабочим вариантом является именно строковый отпечаток в верхнем регистре. Это гарантирует, что SDK СБИС сможет однозначно идентифицировать нужный ключ в системном хранилище и использовать его для формирования защищенного соединения.

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

← На главную