CMS и ГОСТ: как устроена подписанная электронная документация¶
CMS (Cryptographic Message Syntax) — универсальный формат для хранения электронных подписей и криптографически защищённых сообщений. Он применяется в архивах, документообороте, обмене подписанными файлами и других системах с сертификатами X.509.
Смысл CMS — сохранить вместе с подписью необходимые для проверки реквизиты: алгоритм, сведения о подписанте, иногда сам сертификат и подписываемое содержимое. libksba в НАЙС.ОС обрабатывает структуру CMS, а криптографические алгоритмы ГОСТ используются при проверке подписи и целостности.
Что входит в подпись¶
Обычно структура SignedData содержит:
- Информацию об алгоритмах хэширования.
- Подписываемое содержимое либо указание на отдельный файл.
- Сертификаты подписантов (если они включены).
- Данные
SignerInfo: идентификатор подписанта, атрибуты и само значение подписи. - Дополнительные сведения, включая подтверждения времени и сведения об отзыве — если они предусмотрены профилем электронного документооборота.
Присоединённая подпись содержит исходный документ внутри CMS. Отсоединённая подпись хранит только подпись и атрибуты: для проверки нужен отдельный исходный документ, совпадающий побайтно с подписанным.
Как ГОСТ участвует в проверке¶
Сначала определяется схема подписи: ГОСТ Р 34.10-2001 или 2012/256/512. Затем вычисляется указанный хэш, например Стрибог-256. В сертификате извлекается публичный ключ, определяется набор кривой и производится криптографическая проверка значения подписи.
У ГОСТ-подписей важно правильно разобрать саму двоичную подпись. В X.509 она записывается в виде двух компонентов фиксированной длины, расположенных последовательно (s || r). Внутреннему криптографическому механизму нужны разделённые компоненты r и s. libksba выполняет требуемое преобразование.
Почему иногда CMS успешно разбирается, но подпись не проходит проверку¶
- Исходный документ изменился хотя бы на один байт.
- Пользователь передал не тот файл к отсоединённой подписи.
- Ошибочно выбран сертификат или публичный ключ.
- Программа не поддерживает профиль ГОСТ, набор параметров или CMS-атрибуты.
- В цепочке отсутствует промежуточный сертификат.
- Истёк срок действия сертификата либо отсутствует требуемое подтверждение статуса отзыва.
Проверка криптографической подписи и доверие к подписанту — разные этапы. Даже математически правильная подпись не доказывает, что удостоверяющему центру следует доверять.
Практическая проверка¶
Если файл подготовлен в формате CMS и используется OpenSSL, см. руководство по CMS и S/MIME. Там описаны команды создания и проверки сообщения. Не меняйте содержимое исходного документа во время переноса между программами: автоматическое изменение кодировки, переводов строк или метаданных может нарушить проверку.
Для задач GnuPG с сертификатами X.509 используйте инструмент gpgsm. Команда диагностики:
Для конкретного действия выбирайте инструкции используемого профиля документооборота; команды OpenPGP (gpg --sign) не эквивалентны подписанию CMS.