При интеграции с государственной информационной системой маркировки товаров (ГИС МТ / «Честный Знак») пользователи и разработчики типовых и нетиповых конфигураций 1С сталкиваются с ошибкой аутентификации. При попытке получить или обновить токен сессии через метод api/v3/true-api/auth/simpleSignIn возвращается ответ сервера: Код состояния HTTP: 400. Текст ошибки: {"error_message": "data не валидна"}. Разберем по шагам, почему возникает эта ошибка, как устроен регламент работы с API «Честного Знака» и как правильно реализовать подписание данных в 1С.
Для понимания сути ошибки проанализируем регламент получения сессионного токена (единого токена аутентификации или токена в формате JWT), зафиксированный в официальной документации True API:
/auth/key): клиент отправляет запрос и получает в ответ JSON-объект, содержащий пару параметров: uuid (уникальный идентификатор сессии аутентификации) и data (случайная строка символов).data действующим сертификатом УКЭП организации. Подпись должна быть строго присоединенной (attached), а итоговый результат закодирован в формат Base64./auth/simpleSignIn): клиент формирует запрос, передавая полученный ранее uuid, а в параметр data подставляет сформированную присоединенную подпись в виде единой строки Base64.Если сервер возвращает ошибку «data не валидна», это означает, что криптографическая проверка подписи на стороне ГИС МТ провалилась: содержимое расшифрованного сообщения не совпало со случайной строкой, подпись сформирована некорректно, либо данные повреждены при передаче.
Выясним главные факторы, из-за которых сервер маркировки бракует переданную подпись:
data.ПолучитьДвоичныеДанныеИзСтроки платформа 1С по умолчанию может добавлять невидимый маркер последовательности байтов UTF-8 (3 байта EF BB BF). Сервер ГИС МТ производит строгое побайтовое сравнение, и наличие BOM приводит к отказу в авторизации.CRLF. В JSON-запросе для параметра data должна передаваться сплошная монолитная строка без переводов строк и пробелов./auth/key, имеет короткое время жизни (обычно несколько минут). Если между обращением к /auth/key и отправкой в /auth/simpleSignIn возникла задержка (интерактивный ввод пароля от контейнера, медленное обращение к токену), сервер посчитает данные недействительными.Рассмотрим пример формирования корректной присоединенной подписи на клиенте в среде Windows с использованием библиотеки CAdESCOM от КриптоПро. Обратите внимание на установку флага CADESCOM_BASE64_TO_BINARY и передачу параметра bDetached = Ложь:
&НаКлиенте
Функция ПодписатьДанныеЧестныйЗнак(СтрокаData, СертификатКриптографии)
// Преобразуем исходную строку в двоичные данные без BOM
ДвоичныеДанныеData = ПолучитьДвоичныеДанныеИзСтроки(СтрокаData, КодировкаТекста.UTF8, Ложь);
СтрокаBase64 = Base64Строка(ДвоичныеДанныеData);
// Константы CAdESCOM
CADESCOM_BASE64_TO_BINARY = 1; // Входные данные передаются в формате Base64
CADESCOM_CADES_TYPE = 1; // CAdES-BES
CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
// Создаем объект подписанта
oSigner = Новый COMОбъект("CAdESCOM.CPSigner");
oSigner.Certificate = СертификатКриптографии;
// Добавляем штамп времени подписания
oSigningTimeAttr = Новый COMОбъект("CAdESCOM.CPAttribute");
oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
oSigningTimeAttr.Value = ТекущаяДата();
oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
// Инициализируем объект подписанных данных
oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = СтрокаBase64;
// bDetached = Ложь (присоединенная подпись), EncodingType = 0 (Base64)
bDetached = Ложь;
EncodingType = 0;
ПодписанноеСообщение = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);
// Очищаем результат от возможных переводов строк и пробелов
ПодписанноеСообщение = СтрЗаменить(ПодписанноеСообщение, Символы.ПС, "");
ПодписанноеСообщение = СтрЗаменить(ПодписанноеСообщение, Символы.ВК, "");
ПодписанноеСообщение = СокрЛП(ПодписанноеСообщение);
Возврат ПодписанноеСообщение;
КонецФункции
В типовых конфигурациях 1С подписание выполняется не напрямую через ручной вызов COM-объектов, а через механизмы БСП (Библиотеки Стандартных Подсистем) и модуль ИнтеграцияГИСМТ с помощью встроенного объекта платформы МенеджерКриптографии. Если ошибка появилась внезапно в типовой базе, проанализируем следующие моменты:
EF_00_00944621) не устраняет проблему, необходимо обновить релиз конфигурации до самого свежего, где логика взаимодействия переведена на новый стандарт двухэтапной аутентификации.CAdESCOM недоступна — платформа использует вызовы криптопровайдера через PKCS#11 или внутренние интерфейсы./auth/simpleSignIn обязательно должен присутствовать параметр inn организации, от лица которой запрашивается авторизация.