Перейти к содержанию

ГОСТ и CMS/S/MIME: подписанные сообщения и контейнеры

CMS — формат сообщений, который может содержать подписанные данные, вложенный документ, сертификаты и криптографические атрибуты. S/MIME использует CMS для защищённой электронной почты. В НАЙС.ОС операции выполняют команды openssl cms и openssl smime при использовании подходящего ГОСТ-профиля.

1. Различать detached и attached

  • Detached: подпись хранится отдельно от исходного файла. Для проверки нужны оба объекта.
  • Attached: исходный документ входит в контейнер подписанного сообщения.
  • Enveloped: содержимое зашифровано для одного или нескольких получателей.

Это различные конструкции. Подпись не делает содержимое секретным, а шифрование без аутентификации не доказывает отправителя.

2. Подготовить ключ и сертификат подписанта

Используйте signer.key и signer.crt, созданные в разделе PKI. Для CMS важны корректные OID, назначение сертификата и алгоритм подписи.

3. CMS с отсоединённым содержимым

openssl cms -sign -binary \
  -in document.txt \
  -signer signer.crt -inkey signer.key \
  -outform DER -out document.p7s

Проверка с доступным исходным документом и доверенным корнем:

openssl cms -verify -binary -inform DER \
  -in document.p7s -content document.txt \
  -CAfile root.crt -out checked-document.txt

Конкретные CMS-профили ГОСТ зависят от интеграции алгоритмов в CMS-код OpenSSL; для критических обменов согласуйте формат и проверьте контрольный контейнер у получателя.

4. CMS с включённым содержимым

openssl cms -sign -binary -nodetach \
  -in document.txt \
  -signer signer.crt -inkey signer.key \
  -outform DER -out attached.p7m
openssl cms -verify -binary -inform DER -in attached.p7m \
  -CAfile root.crt -out restored-document.txt

5. Просмотр контейнера и алгоритмов

openssl cms -cmsout -print -inform DER -in document.p7s | head -100
openssl asn1parse -inform DER -in document.p7s -i | head -80

Не пытайтесь диагностировать неизвестный CMS-файл простым cat — он может быть бинарным ASN.1 DER.

6. S/MIME

Для почтовых сообщений upstream gost-engine описывает использование ГОСТ-алгоритмов через интерфейсы OpenSSL. При создании шифрованного S/MIME-сообщения важно явно выбрать согласованный симметричный шифр, а также проверить возможность расшифрования на стороне получателя.

7. Типовые проблемы

Признак Проверка
unsupported content type Правильный формат CMS/PKCS#7
digest failure Исходные байты документа, режим -binary, digest
Контейнер распознаётся, проверка не проходит Подпись, сертификат, доверенный корень, OID
Подпись проходит в OpenSSL, не проходит в другой системе Профиль CMS, набор подписанных атрибутов, кодировка

Upstream: gost-engine/README.gost, Provider limitations. См. также подпись и КриптоПро.