ГОСТ и 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. См. также подпись и КриптоПро.