Как реализовать авторизацию в системе «Честный знак» через API в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Интеграция с государственной системой маркировки «Честный знак» (ГИС МТ) на устаревшей платформе 1С 7.7 представляет собой определенную сложность из-за отсутствия встроенных механизмов работы с JSON и современными криптографическими стандартами. Однако, используя внешние COM-объекты, такие как WinHttp.WinHttpRequest.5.1, CAPICOM и CAdESCOM, мы можем успешно реализовать полный цикл авторизации.

Процесс получения токена авторизации в «Честном знаке» всегда состоит из двух этапов:

  1. Получение данных для подписания (uuid и data) методом GET.
  2. Подписание полученных данных и их отправка методом POST для получения финального токена (JWT).

Рассмотрим подробно каждый шаг этой задачи.

Шаг 1: Получение ключа авторизации

Для начала нам необходимо обратиться к серверу ИС МП, чтобы получить уникальный идентификатор сессии и случайную строку данных, которую мы должны будем подписать. Для этого воспользуемся объектом WinHttp.WinHttpRequest.5.1.

Проанализируем пример кода для выполнения GET-запроса:


Соеденение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Соеденение.Option(2, "utf-8");
URL = "https://ismp.crpt.ru/api/v3/auth/cert/key";
Соеденение.Open("GET", URL, 0);
Соеденение.SetRequestHeader("Content-Type", "application/json");
Соеденение.Send();

Если Соеденение.Status = 200 Тогда
    ОтветСервера = Соеденение.ResponseText;
    // Ответ придет в формате {"uuid":"...","data":"..."}
Иначе
    Сообщить("Ошибка запроса: " + Соеденение.Status);
КонецЕсли;

Обратите внимание, что в 1С 7.7 нет встроенного парсера JSON. Для извлечения значений uuid и data из строки можно использовать простые функции работы со строками (найти вхождения кавычек и двоеточий) или воспользоваться объектом MSScriptControl.ScriptControl для исполнения JavaScript-кода.

Шаг 2: Выбор сертификата ЭЦП

Чтобы подписать полученные данные, нам нужно найти соответствующий сертификат, установленный в системе (обычно в хранилище «Личное» текущего пользователя). Для этого удобно использовать объект CAPICOM.Store.

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


Функция ПолучитьСписокСертификатов()
    РезСписок = СоздатьОбъект("СписокЗначений");
    oStore = СоздатьОбъект("CAPICOM.Store");
    // 2 - CAPICOM_CURRENT_USER_STORE, "My" - личные сертификаты
    oStore.Open(2, "My", 0); 
    
    Количество = oStore.Certificates.Count;
    Для а = 1 По Количество Цикл
        Объект = oStore.Certificates.Item(а);
        Отпечаток = Объект.Thumbprint;
        Субъект = Объект.SubjectName;
        // Извлекаем понятное имя (CN) из строки субъекта
        Наименование = Субъект; 
        РезСписок.ДобавитьЗначение(Отпечаток, Наименование);
    КонецЦикла;
    
    oStore.Close();
    Возврат РезСписок;
КонецФункции

Важный момент: Для работы с объектами CAdESCOM и CAPICOM в системе должен быть установлен «КриптоПро CSP» и соответствующий браузерный плагин. Если объекты не создаются, проверьте регистрацию библиотек в regsvr32.

Шаг 3: Подписание данных

После того как мы получили data из первого запроса и выбрали сертификат, необходимо сформировать отсоединенную электронную подпись. «Честный знак» требует подпись в формате CAdES-BES (усовершенствованная подпись).

Рассмотрим функцию подписания текста. На вход подается строка data и выбранный сертификат (объект), полученный по отпечатку:


Функция ПодписатьТекст(ТекстДляПодписи, СертификатОбъект)
    // Константы для работы с CAdES
    CADESCOM_BASE64_TO_BINARY = 1;
    CADESCOM_CADES_TYPE = 1; // CAdES-BES
    
    oSigner = СоздатьОбъект("CAdESCOM.CPSigner");
    oSigner.Certificate = СертификатОбъект;
    // Если на контейнер установлен пароль, его нужно указать здесь:
    // oSigner.KeyPin = "ваш_пароль";
    
    oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData");
    oSignedData.ContentEncoding = 0; // Строка
    oSignedData.Content = ТекстДляПодписи;
    
    // Метод SignCades возвращает подпись в формате Base64
    // Третий параметр Ложь означает прикрепленную подпись (для авторизации обычно нужна она)
    // Но ГИС МТ часто требует именно содержимое в формате Base64
    Подпись = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, 0);
    
    Возврат Подпись;
КонецФункции

Выясним причину возможных ошибок на этом этапе. Если метод SignCades выдает ошибку «Поле агрегатного объекта не обнаружено», это часто означает, что версия библиотеки CAdESCOM не поддерживает данный метод или в системе не настроена цепочка доверия для выбранного сертификата.

Шаг 4: Получение итогового токена

На последнем этапе мы формируем JSON-тело, содержащее исходный uuid и нашу новую подпись в поле data. Этот запрос отправляется методом POST на адрес /api/v3/auth/cert.

Проанализируем пример финального запроса:


ТекстЗапроса = "{""uuid"":""" + ВыбУИД + """,""data"":""" + ПодписанныеДанные + """}";

Соеденение.Open("POST", "https://ismp.crpt.ru/api/v3/auth/cert", 0);
Соеденение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
Соеденение.Send(ТекстЗапроса);

Если Соеденение.Status = 200 Тогда
    ОтветСТокеном = Соеденение.ResponseText;
    // Извлекаем токен из JSON
    // Сохраняем его для дальнейших запросов в заголовок Authorization: Bearer <token>
Иначе
    Сообщить("Авторизация не удалась: " + Соеденение.ResponseText);
КонецЕсли;

Рекомендации по стабильной работе

При реализации интеграции в 1С 7.7 примите во внимание следующие советы:

Таким образом, мы разобрали, как с помощью внешних библиотек обойти ограничения платформы 1С 7.7 и настроить полноценный обмен данными с системой маркировки.

← На главную