При работе с криптографией в 1С программисты часто сталкиваются с ситуацией, когда стандартный метод ПроверитьПодпись объекта МенеджерКриптографии выдает непонятную ошибку: «Язык описания абстрактного синтаксиса данных. Обнаружено неверное значение тега». Чаще всего это происходит при проверке файлов, подписанных в сторонних приложениях (например, через КриптоПро CSP напрямую), если подпись является отсоединенной и содержит цепочку сертификатов.
В этой статье мы подробно разберем причины возникновения этой ошибки, проанализируем влияние версий платформы и форматов файлов, а также выработаем пошаговое решение проблемы.
Проанализируем техническую сторону вопроса. Ошибка «Обнаружено неверное значение тега» в контексте ASN.1 (Abstract Syntax Notation One) означает, что парсер криптографических данных встретил в структуре файла .p7s элемент, который он не может корректно интерпретировать. Как выяснилось в ходе обсуждения и подтверждено официальными данными 1С, проблема часто кроется в баге платформы под номером 60002924.
Суть ошибки заключается в том, что МенеджерКриптографии некорректно обрабатывает данные, если в подписи содержится более одного сертификата (например, сам сертификат подписанта и промежуточный сертификат удостоверяющего центра). Если в метод ПроверитьПодпись в качестве третьего параметра передается Неопределено, платформа пытается самостоятельно извлечь сертификат из цепочки и спотыкается на структуре ASN.1.
Решение: Проверьте версию вашей платформы. Ошибка официально исправлена в следующих релизах:
Если ваша версия ниже указанных, настоятельно рекомендуем обновить платформу до актуального патча или использовать обходные пути, описанные ниже.
Разберем ситуацию с форматом передаваемых данных. Криптографические методы 1С (такие как ПроверитьПодпись, ПроверитьСертификат) ожидают на вход данные в бинарном виде (формат DER). Однако многие сторонние системы выгружают подпись в формате PEM — это тот же файл, но закодированный в Base64 и обернутый в текстовые заголовки типа -----BEGIN PKCS7-----.
Если вы передаете в метод ДвоичныеДанные, полученные простым чтением текстового файла Base64, 1С не сможет их обработать, так как они не соответствуют бинарной структуре ASN.1. Вы получите ту самую ошибку «неверного значения тега».
Как правильно подготовить данные:
ДвоичныеДанные.Посмотрим на пример кода, реализующий правильную загрузку:
// Предположим, ПодписьСтрокой — это содержимое файла .p7s в Base64
ЧистаяСтрокаBase64 = СтрЗаменить(ПодписьСтрокой, "-----BEGIN PKCS7-----", "");
ЧистаяСтрокаBase64 = СтрЗаменить(ЧистаяСтрокаBase64, "-----END PKCS7-----", "");
ЧистаяСтрокаBase64 = СтрЗаменить(ЧистаяСтрокаBase64, Символы.ПС, "");
ЧистаяСтрокаBase64 = СтрЗаменить(ЧистаяСтрокаBase64, Символы.ВК, "");
ДвоичныеДанныеПодписи = Base64Значение(СокрЛП(ЧистаяСтрокаBase64));
МенеджерКриптографии = Новый МенеджерКриптографии("", "", 80);
СертификатИзПодписи = Неопределено;
Попытка
МенеджерКриптографии.ПроверитьПодпись(ДанныеФайла, ДвоичныеДанныеПодписи, СертификатИзПодписи);
Сообщить("Подпись верна. Владелец: " + СертификатИзПодписи.Субъект);
Исключение
Сообщить("Ошибка проверки: " + ОписаниеОшибки());
КонецПопытки;
Если вы используете типовые механизмы Библиотеки Стандартных Подсистем (БСП), проверка может выполняться через внешнюю компоненту ExtraCryptoAPI. Здесь часто возникает проблема несовместимости разрядности клиента и компоненты.
Выясним причину: если ваш «Тонкий клиент» имеет разрядность x86-64, а в справочнике «Внешние компоненты» загружена только 32-битная версия ExtraCryptoAPI, 1С не сможет ее подключить. Это приводит к ошибкам чтения криптографических данных или невозможности проверить цепочку сертификатов.
Рассмотрим шаги для исправления:
Проанализируем ситуацию, когда математически подпись верна, но менеджер криптографии все равно выдает ошибку. Для валидации цепочки сертификатов 1С обращается к хранилищу сертификатов операционной системы. Если подпись содержит промежуточный сертификат, но в системе (на сервере или клиенте, в зависимости от места исполнения кода) не установлен Корневой сертификат удостоверяющего центра (например, Минцифры), проверка может завершиться неудачей.
Рекомендация: Установите все актуальные корневые и промежуточные сертификаты УЦ в хранилище «Доверенные корневые центры сертификации» той учетной записи, под которой работает служба сервера 1С (если проверка идет на сервере) или текущего пользователя (если на клиенте).
Если штатный МенеджерКриптографии на старых версиях платформы продолжает выдавать ошибку ASN.1, а обновить платформу не представляется возможным, рассмотрим использование CAdESCOM (CryptoPro Browser Plug-in). Этот метод более гибок в работе с различными типами подписей (CAdES-BES, CAdES-X Long и т.д.).
Посмотрим на логику работы через COM-объект:
Попытка
// Создаем объект подписи
SignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
SignedData.ContentEncoding = 1; // CADESCOM_BASE64_TO_BINARY
SignedData.Content = Base64Строка(ДвоичныеДанныеФайла);
// Проверяем отсоединенную подпись
// Параметры: подпись в Base64, признак отсоединенной подписи (Истина), тип подписи
SignedData.VerifyCades(Base64Строка(ДвоичныеДанныеПодписи), 0, Истина);
Сообщить("Успешно проверено через COM");
Исключение
Сообщить("COM-ошибка: " + ОписаниеОшибки());
КонецПопытки;
Этот метод часто помогает обойти внутренние ограничения платформенного менеджера криптографии, так как использует механизмы самого КриптоПро напрямую.
Чтобы успешно решить проблему с ошибкой «неверного значения тега», выполните следующие действия:
ExtraCryptoAPI для соответствующего клиента.Соблюдение этих правил позволит вам корректно работать с квалифицированной электронной подписью, созданной в любых внешних системах.