Как исправить ошибку Честного Знака 400 data не валидна при авторизации в 1С

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

При интеграции с государственной информационной системой маркировки товаров (ГИС МТ / «Честный Знак») пользователи и разработчики типовых и нетиповых конфигураций 1С сталкиваются с ошибкой аутентификации. При попытке получить или обновить токен сессии через метод api/v3/true-api/auth/simpleSignIn возвращается ответ сервера: Код состояния HTTP: 400. Текст ошибки: {"error_message": "data не валидна"}. Разберем по шагам, почему возникает эта ошибка, как устроен регламент работы с API «Честного Знака» и как правильно реализовать подписание данных в 1С.

Принцип двухэтапной аутентификации в ГИС МТ

Для понимания сути ошибки проанализируем регламент получения сессионного токена (единого токена аутентификации или токена в формате JWT), зафиксированный в официальной документации True API:

  1. Запрос случайных данных (метод GET /auth/key): клиент отправляет запрос и получает в ответ JSON-объект, содержащий пару параметров: uuid (уникальный идентификатор сессии аутентификации) и data (случайная строка символов).
  2. Подписание строки данных: клиент должен подписать полученную строку data действующим сертификатом УКЭП организации. Подпись должна быть строго присоединенной (attached), а итоговый результат закодирован в формат Base64.
  3. Отправка подписанных данных (метод POST /auth/simpleSignIn): клиент формирует запрос, передавая полученный ранее uuid, а в параметр data подставляет сформированную присоединенную подпись в виде единой строки Base64.
  4. Ответ сервера: при успешной проверке подписи и срока жизни сессии сервис возвращает токен доступа с кодом HTTP 200.

Если сервер возвращает ошибку «data не валидна», это означает, что криптографическая проверка подписи на стороне ГИС МТ провалилась: содержимое расшифрованного сообщения не совпало со случайной строкой, подпись сформирована некорректно, либо данные повреждены при передаче.

Основные технические причины ошибки «data не валидна»

Выясним главные факторы, из-за которых сервер маркировки бракует переданную подпись:

  1. Открепленная подпись вместо присоединенной. Серверу «Честного Знака» требуется присоединенная подпись (CAdES-BES), внутри которой содержатся сами подписываемые данные. Если отправить открепленную подпись (detached), сервис не сможет сопоставить ее с исходным значением data.
  2. Наличие символов BOM (Byte Order Mark). При получении двоичных данных из строки через функцию ПолучитьДвоичныеДанныеИзСтроки платформа 1С по умолчанию может добавлять невидимый маркер последовательности байтов UTF-8 (3 байта EF BB BF). Сервер ГИС МТ производит строгое побайтовое сравнение, и наличие BOM приводит к отказу в авторизации.
  3. Переносы строк и пробелы в Base64. Криптопровайдеры (например, КриптоПро CSP) при выгрузке длинных цепочек Base64 могут автоматически разбивать строку на строки по 64 или 76 символов символами CRLF. В JSON-запросе для параметра data должна передаваться сплошная монолитная строка без переводов строк и пробелов.
  4. Истечение срока жизни uuid/data. Пара значений, выданная методом /auth/key, имеет короткое время жизни (обычно несколько минут). Если между обращением к /auth/key и отправкой в /auth/simpleSignIn возникла задержка (интерактивный ввод пароля от контейнера, медленное обращение к токену), сервер посчитает данные недействительными.
  5. Некорректная обработка входящей строки криптопровайдером. При передаче данных в криптографический COM-объект необходимо явно указывать кодировку источника, чтобы строка не была искажена перед наложением подписи.

Реализация подписания данных через CAdESCOM

Рассмотрим пример формирования корректной присоединенной подписи на клиенте в среде 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С (ERP, КА, УТ)

В типовых конфигурациях 1С подписание выполняется не напрямую через ручной вызов COM-объектов, а через механизмы БСП (Библиотеки Стандартных Подсистем) и модуль ИнтеграцияГИСМТ с помощью встроенного объекта платформы МенеджерКриптографии. Если ошибка появилась внезапно в типовой базе, проанализируем следующие моменты:

  1. Установка актуальных обновлений. Фирма «1С» регулярно выпускает исправления механизмов интеграции с ГИС МТ при изменениях на стороне True API. Если патч (например, EF_00_00944621) не устраняет проблему, необходимо обновить релиз конфигурации до самого свежего, где логика взаимодействия переведена на новый стандарт двухэтапной аутентификации.
  2. Подписание на сервере или на клиенте. Проверьте настройку программы: где именно выполняется операция криптографии. Если включена опция «Выполнять подписание и шифрование на сервере», то криптопровайдер, сертификат и закрытый ключ должны быть корректно установлены в операционной системе сервера 1С:Предприятия. Если сервер работает под управлением Linux, COM-технология CAdESCOM недоступна — платформа использует вызовы криптопровайдера через PKCS#11 или внутренние интерфейсы.
  3. Сертификат и доверенность (МЧД). Убедитесь, что сертификат электронного ключа добавлен в личный кабинет «Честного Знака». Если вход осуществляется по сертификату физического лица по машиночитаемой доверенности, в теле запроса /auth/simpleSignIn обязательно должен присутствовать параметр inn организации, от лица которой запрашивается авторизация.
  4. Синхронизация системного времени. Расхождение времени на машине, где формируется подпись, с сервером точного времени более чем на 1-2 минуты приводит к тому, что встроенный штамп времени (Signing Time) признается недействительным серверами ГИС МТ.
← На главную