Как создать отдельную подпись CMS? Cms подпись


Форматы электронной подписи / Блог компании «Актив» / Хабр

Статья посвящена обзору стандартов СMS (Cryptographic Message Syntax) для подписанных сообщений.

Для чего нужен CMS

Стандарт CMS описывает структуру криптографических сообщений, включающих в себя защищенные данные вместе со сведениями, необходимыми для их корректного открытия или использования. Например, в сообщении размещаются защищенные данные, информация об алгоритме хеширования и подписи, времени подписи, сертификате открытого ключа, цепочке сертификации и т.д. Некоторые из указанных атрибутов носят опциональный характер, но приложение может само определить необходимость их наличия. У каждого алгоритма есть набор параметров, который должен быть согласован на обеих сторонах: для ГОСТ 34.10-2001, помимо открытого ключа, это модуль p, коэффициенты эллиптической кривой a и b и порядок циклической подгруппы точек эллиптической кривой q. И все это нужно каким-то образом передать адресату сообщения. RSA Laboratories в серии своих стандартов криптографии с открытом ключом (PKCS) предложила решение этой проблемы путем определения синтаксиса для защищенных сообщений в следующих стандартах: Развитием этих стандартов стал стандарт CMS. CMS кроме определенной заголовком статьи подписи поддерживает операции шифрования, хеширования и вычисления имитовставки, в том числе и по российским алгоритмам (RFC 4490), а также множественную инкапсуляцию. Последнее означает, что сообщение формата CMS может лежать внутри другого CMS сообщения.

Всего CMS поддерживает шесть типов данных:

В рамках статьи мы подробно рассмотрим только данные с электронной подписью (signed data).

Чтобы не путаться в терминологии, далее исходные данные, которые мы хотим передать защищенным способом, будут называться данными, а получившееся защищенное сообщение CMS – просто сообщением.

Стандарт CMS (PKCS #7 и RFC 5652): теория

Чуть истории

Синтаксис криптографических сообщений (CMS) впервые был определен в PKCS #7, который позже был опубликован в качестве рекомендаций RFC 2315 «PKCS #7: Cryptographic Message Syntax Version 1.5». Спустя еще несколько версий RFC в сентябре 2009 года был принят RFC 5652 «Cryptographic Message Syntax (CMS)», который является действующим стандартом на данный момент. Под спойлером иллюстрируется тяжелая судьба стандарта. Смотреть Эволюция PKCS#7/CMS

Подпись в CMS-формате (signed data type)

Подпись, описанная стандартом CMS, характеризуется следующими особенностями:
  1. Данные могут быть подписаны несколькими сторонами (множественная подпись). В таком случае в сообщении будут присутствовать несколько структур SignerInfo с информацией о подписывающих сторонах: значением подписи и необходимой для проверки ее подлинности информацией.
  2. Тип данных никак не регламентируется, лишь уточняется, что в качестве данных может быть сообщение формата CMS, то есть подписанное Алисой сообщение может быть целиком подписано Бобом.
  3. Подписывать можно не только данные, но и некоторые атрибуты сообщения – хеш сообщения (digest message), время подписи (signing time), значение другой подписи (countersignature).
  4. Открытый ключ подписывающей стороны может быть несертифицированным.
  5. Подпись может отсутствовать и вовсе.
Данные с электронной подписью используются не только для подписи содержимого и часто используются для распространения сертификатов и списков отзыва сертификатов (Certification Revocation List, CRL). В таком случае подписываемые данные отсутствуют, а поля Certificates и CRLs, наоборот, присутствуют.

Подписанное Алисой сообщение в формате CMS будет иметь следующий вид (серым отмечены необязательные атрибуты):

Если Боб решает целиком подписать полученное от Алисы сообщение, то используется механизм инкапсуляции, и сообщение будет выглядеть вот так:

CMS предлагает два интересных атрибута, расширяющих возможности обычной подписи: время подписи (Signing Time) и контрасигнатуру (Countersignature). Первый атрибут определяет предполагаемое время осуществления подписи, а второй предназначен для подписи другой подписи (подписывается хеш от значения подписи). Атрибут Countersignature представляет собой структуру Signer Info с отсутствующим в Signed Attributes атрибутом Content Type и обязательно присутствующим атрибутом Message Digest. Атрибут Countersignature может иметь свой собственный атрибут Countersignature.

Если Боб решит подписать только данные, переданные Алисой, и заодно подписать подпись Алисы, то сообщение будет иметь такой вид:

Галопом по Европам оставшимся типам

СMS предлагает еще несколько интересных типов сообщений, не охватываемых темой этой статьи. Поэтому буквально по паре слов об оставшихся типах для общей картины. Упакованные данные (enveloped data) представляют собой зашифрованные данные вместе с зашифрованными для одного или более получателей ключами, которыми эти данные были зашифрованы. Комбинация зашифрованного сообщения с одним зашифрованным ключом шифрования для одного получателя называется цифровым конвертом. Данный тип используется в качестве конверта с (подписанными) данными для одного или нескольких получателей. Хешированные данные (данные вместе со своим хешем) используются для проверки целостности сообщения и часто являются содержимым упакованных данных. Зашифрованные данные часто используются для шифрования данных для локального хранилища, иногда с выработанным из пароля ключом шифрования. Данные из аутентифицированного источника (данные с проверкой подлинности) включают в себя данные вместе с их MAC-кодом и зашифрованными ключами аутентификации для одного или нескольких получателей. Используются для защиты целостности сообщений для неограниченного количества получателей.

В следующей статье мы подробно остановимся на сообщениях типа enveloped data с использованием российских криптоалгоритмов.

CMS в реальной жизни

Стандарт CMS имеет немало воплощений в современном мире IT – на нем основаны: Закономерным развитием идей CMS для сообщений с электронной подписью cтал CAdES (CMS Advanced Electronic Signature), расширенный стандарт подписанных сообщений CMS, который также послужит темой для еще одной нашей статьи.

Как реализовать на практике?

Стандарт CMS/PKCS#7 с поддержкой российских криптоалгоритмов реализован в сертифицированных СКЗИ наших партнеров: Кроме того, стандарт CMS с российской криптографией реализован в Open Source приложении OpenSSL.

Наша компания поддержала CMS c российской криптографией в продукте Рутокен Плагин. Рутокен Плагин предназначен для использования в браузерах, все криптографические операции производятся аппаратно, «на борту» USB-токена.

habr.com

Форматы электронной подписи

Статья посвящена обзору стандартов СMS (Cryptographic Message Syntax) для подписанных сообщений.

Для чего нужен CMS

Стандарт CMS описывает структуру криптографических сообщений, включающих в себя защищенные данные вместе со сведениями, необходимыми для их корректного открытия или использования. Например, в сообщении размещаются защищенные данные, информация об алгоритме хеширования и подписи, времени подписи, сертификате открытого ключа, цепочке сертификации и т.д. Некоторые из указанных атрибутов носят опциональный характер, но приложение может само определить необходимость их наличия. У каждого алгоритма есть набор параметров, который должен быть согласован на обеих сторонах: для ГОСТ 34.10-2001, помимо открытого ключа, это модуль p, коэффициенты эллиптической кривой a и b и порядок циклической подгруппы точек эллиптической кривой q. И все это нужно каким-то образом передать адресату сообщения.RSA Laboratories в серии своих стандартов криптографии с открытом ключом (PKCS) предложила решение этой проблемы путем определения синтаксиса для защищенных сообщений в следующих стандартах:

Развитием этих стандартов стал стандарт CMS. CMS кроме определенной заголовком статьи подписи поддерживает операции шифрования, хеширования и вычисления имитовставки, в том числе и по российским алгоритмам (RFC 4490), а также множественную инкапсуляцию. Последнее означает, что сообщение формата CMS может лежать внутри другого CMS сообщения.

Всего CMS поддерживает шесть типов данных:

В рамках статьи мы подробно рассмотрим только данные с электронной подписью (signed data).

Чтобы не путаться в терминологии, далее исходные данные, которые мы хотим передать защищенным способом, будут называться данными, а получившееся защищенное сообщение CMS – просто сообщением.

Стандарт CMS (PKCS #7 и RFC 5652): теория

Чуть истории

Синтаксис криптографических сообщений (CMS) впервые был определен в PKCS #7, который позже был опубликован в качестве рекомендаций RFC 2315 «PKCS #7: Cryptographic Message Syntax Version 1.5». Спустя еще несколько версий RFC в сентябре 2009 года был принят RFC 5652 «Cryptographic Message Syntax (CMS)», который является действующим стандартом на данный момент.Под спойлером иллюстрируется тяжелая судьба стандарта.

Смотреть Эволюция PKCS#7/CMS

Подпись в CMS-формате (signed data type)

Подпись, описанная стандартом CMS, характеризуется следующими особенностями:

  1. Данные могут быть подписаны несколькими сторонами (множественная подпись). В таком случае в сообщении будут присутствовать несколько структур SignerInfo с информацией о подписывающих сторонах: значением подписи и необходимой для проверки ее подлинности информацией.
  2. Тип данных никак не регламентируется, лишь уточняется, что в качестве данных может быть сообщение формата CMS, то есть подписанное Алисой сообщение может быть целиком подписано Бобом.
  3. Подписывать можно не только данные, но и некоторые атрибуты сообщения – хеш сообщения (digest message), время подписи (signing time), значение другой подписи (countersignature).
  4. Открытый ключ подписывающей стороны может быть несертифицированным.
  5. Подпись может отсутствовать и вовсе.

Данные с электронной подписью используются не только для подписи содержимого и часто используются для распространения сертификатов и списков отзыва сертификатов (Certification Revocation List, CRL). В таком случае подписываемые данные отсутствуют, а поля Certificates и CRLs, наоборот, присутствуют.

Подписанное Алисой сообщение в формате CMS будет иметь следующий вид (серым отмечены необязательные атрибуты):

Если Боб решает целиком подписать полученное от Алисы сообщение, то используется механизм инкапсуляции, и сообщение будет выглядеть вот так:

CMS предлагает два интересных атрибута, расширяющих возможности обычной подписи: время подписи (Signing Time) и контрасигнатуру (Countersignature). Первый атрибут определяет предполагаемое время осуществления подписи, а второй предназначен для подписи другой подписи (подписывается хеш от значения подписи). Атрибут Countersignature представляет собой структуру Signer Info с отсутствующим в Signed Attributes атрибутом Content Type и обязательно присутствующим атрибутом Message Digest. Атрибут Countersignature может иметь свой собственный атрибут Countersignature.

Если Боб решит подписать только данные, переданные Алисой, и заодно подписать подпись Алисы, то сообщение будет иметь такой вид:

Галопом по Европам оставшимся типам

СMS предлагает еще несколько интересных типов сообщений, не охватываемых темой этой статьи. Поэтому буквально по паре слов об оставшихся типах для общей картины.Упакованные данные (enveloped data) представляют собой зашифрованные данные вместе с зашифрованными для одного или более получателей ключами, которыми эти данные были зашифрованы. Комбинация зашифрованного сообщения с одним зашифрованным ключом шифрования для одного получателя называется цифровым конвертом. Данный тип используется в качестве конверта с (подписанными) данными для одного или нескольких получателей.Хешированные данные (данные вместе со своим хешем) используются для проверки целостности сообщения и часто являются содержимым упакованных данных.Зашифрованные данные часто используются для шифрования данных для локального хранилища, иногда с выработанным из пароля ключом шифрования.Данные из аутентифицированного источника (данные с проверкой подлинности) включают в себя данные вместе с их MAC-кодом и зашифрованными ключами аутентификации для одного или нескольких получателей. Используются для защиты целостности сообщений для неограниченного количества получателей.

В следующей статье мы подробно остановимся на сообщениях типа enveloped data с использованием российских криптоалгоритмов.

CMS в реальной жизни

Стандарт CMS имеет немало воплощений в современном мире IT – на нем основаны:

Закономерным развитием идей CMS для сообщений с электронной подписью cтал CAdES (CMS Advanced Electronic Signature), расширенный стандарт подписанных сообщений CMS, который также послужит темой для еще одной нашей статьи.

Как реализовать на практике?

Стандарт CMS/PKCS#7 с поддержкой российских криптоалгоритмов реализован в сертифицированных СКЗИ наших партнеров:

Кроме того, стандарт CMS с российской криптографией реализован в Open Source приложении OpenSSL.

Наша компания поддержала CMS c российской криптографией в продукте Рутокен Плагин. Рутокен Плагин предназначен для использования в браузерах, все криптографические операции производятся аппаратно, «на борту» USB-токена.

Автор: xelya

Источник

www.pvsm.ru

openssl - Как создать отдельную подпись CMS?

Да, и это даже значение по умолчанию для утилиты командной строки - вы должны указать -nodetach для "встраивания" данных, Но контринтетитивно формат PKCS # 7/CMS не является значением по умолчанию (S/MIME is), поэтому вы должны указать -outform. Предполагая, что у вас есть закрытый ключ в одном из поддерживаемых форматов PEM в pkey.pem и соответствующий сертификат также в PEM в cert.pem, а данные в data и вы хотите, чтобы "сырой" (двоичный) CMS в signature

openssl cms -sign -signer cert.pem -inkey pkey.pem -binary -in data -outform der -out signature

Если cert и ключ находятся в одном и том же файле PEM (иногда удобная функция OpenSSL слегка расширенного формата PEM), укажите этот файл на -signer и опустите -inkey. Если ключ и сертификат находятся в любом формате (-ях), отличном от PEM, включая PKCS # 12, сначала конвертируйте их в PEM.

Выход PEM-формата изменится на -outform pem. В OS/shell, поддерживающем перенаправление (которое, я думаю, сейчас полностью, кроме VMS), опускание -in или -out использует stdin или stdout соответственно, которые могут включать в себя трубопроводы от или к другим процессам. (Конечно, жизненно важно, чтобы подписанные данные были воспроизведены бит-бит для получателя/верификатора, и часто это сложнее, если оно не в файле.)

По умолчанию OpenSSL использует signedAttributes aka двухуровневую или непрямую форму подписи; для подписи только данных (хеширование) добавить -noattr. См. Man-страницу для получения дополнительных параметров: опустить сертификат подписчика или включить дополнительные (цепочки) сертификаты для верификатора, изменить указанные типы содержимого и подписи хеша и алгоритма.

Если вы предпочитаете писать свою собственную программу с использованием (C) API, начинайте с CMS_sign. Вы также должны видеть эти (и связанные) справочные страницы локально в любой системе Unix с установленным OpenSSL, обычно просто man cms и man CMS_sign и т.д., Хотя некоторые установки могут потребовать настройки вашего MANPATH и/или указания специальных разделов, таких как 1ssl и 3ssl.

qaru.site

c# - Подпись CMS - какая разница?

Цель штампа времени - доказать, что подпись была создана до определенного времени, поэтому с отметкой времени вы должны подписать цифровую подпись и текущее время. Метка времени должна быть добавлена в подпись CMS как атрибут unsigned. Кроме того SignatureTimeStampToken является самой подписью.

Чтобы добавить отметку времени к CMS, вы можете использовать атрибут метки времени подписи, который имеет идентификатор объекта 1.2.840.113549.1.9.16.2.14 и имеет тип ASN.1 (информация, приведенная ниже, извлекается из CMS и TSP RFC)

SignatureTimeStampToken ::= TimeStampToken TimeStampToken ::= ContentInfo -- contentType is id-signedData ([CMS]) -- content is SignedData ([CMS]) SignedData ::= SEQUENCE { version CMSVersion, digestAlgorithms DigestAlgorithmIdentifiers, encapContentInfo EncapsulatedContentInfo, certificates [0] IMPLICIT CertificateSet OPTIONAL, crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, signerInfos SignerInfos }

В TimeStampToken поля типа EncapsulatedContentInfo конструкции SignedData имеют следующие значения:

eContentType - это идентификатор объекта, который однозначно определяет тип содержимого. Для маркера отметки времени он определяется как:

id-ct-TSTInfo OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) ct(1) 4}

eContent - это сам контент, переносимый как строка октета. eContent ДОЛЖЕН быть закодированным DER значением TSTInfo.

Маркер метки времени НЕ ДОЛЖЕН содержать какие-либо подписи, отличные от подписи TSA. Идентификатор сертификата (ESSCertID) сертификата TSA ДОЛЖЕН быть включен как атрибут signerInfo внутри атрибута SigningCertificate.

TSTInfo ::= SEQUENCE { version INTEGER { v1(1) }, policy TSAPolicyId, messageImprint MessageImprint, -- MUST have the same value as the similar field in -- TimeStampReq serialNumber INTEGER, -- Time-Stamping users MUST be ready to accommodate integers -- up to 160 bits. genTime GeneralizedTime, accuracy Accuracy OPTIONAL, ordering BOOLEAN DEFAULT FALSE, nonce INTEGER OPTIONAL, -- MUST be present if the similar field was present -- in TimeStampReq. In that case it MUST have the same value. tsa [0] GeneralName OPTIONAL, extensions [1] IMPLICIT Extensions OPTIONAL }

Надеюсь это поможет,

qaru.site

Как создать отдельную подпись CMS?

Да, вы можете, и это даже значение по умолчанию для the commandline utility - вы должны указать -nodetach для «встраивания» данных. Но в противоположном случае формат PKCS # 7/CMS равен , а не по умолчанию (S/MIME is), поэтому вы должны указать -outform. Предполагая, что у вас есть PrivateKey в одном из нескольких поддерживаемых форматов PEM в pkey.pem и соответствующий сертификат также в PEM в cert.pem, и данные в data и вы хотите «сырой» (двоичный) CMS в signature:

openssl cms -sign -signer cert.pem -inkey pkey.pem -binary -in data -outform der -out signature

Если сертификат и ключ находятся в одном файле PEM (иногда удобная функция немного расширенного формата PEM для OpenSSL), укажите этот файл на -signer и опустите -inkey. Если ключ и сертификат находятся в любом формате (-ях), отличном от PEM, включая PKCS # 12, сначала конвертируйте их в PEM.

Для изменения выходного сигнала PEM на -outform pem. В OS/shell, поддерживающем перенаправление (которое, я думаю, сейчас все, кроме VMS), опускание -in или -out использует stdin или stdout соответственно, которые могут включать в себя трубопроводы от или к другим процессам. (Конечно, важно, чтобы подписанные данные были воспроизведены бит-бит для получателя/верификатора, и часто это сложнее, если оно не находится в файле.)

По умолчанию OpenSSL использует signedAttributes aka двухуровневый aka косвенная форма подписи; подписать только данные (хешированные) добавить -noattr. См. Man-страницу для получения дополнительных параметров: опустить сертификат подписчика или включить дополнительные (цепочки) сертификаты для верификатора, изменить указанные типы содержимого и подписи хеша и алгоритма.

Если вы предпочитаете писать свою собственную программу с использованием (C) API, начинайте с CMS_sign. Вы также должны быть в состоянии видеть эти (и связанные) справочные страницы локально в любой системе Unix с установленным OpenSSL, как правило, только man cms и man CMS_sign и т. Д., Хотя некоторые установки могут потребовать корректировки вашего MANPATH и/или указания специальных раздел

stackoverrun.com

Как создать отдельную подпись CMS?

Да, вы можете, и это даже значение по умолчанию для the commandline utility - вы должны указать -nodetach для «встраивания» данных. Но в противоположном случае формат PKCS # 7/CMS равен , а не по умолчанию (S/MIME is), поэтому вы должны указать -outform. Предполагая, что у вас есть PrivateKey в одном из нескольких поддерживаемых форматов PEM в pkey.pem и соответствующий сертификат также в PEM в cert.pem, и данные в data и вы хотите «сырой» (двоичный) CMS в signature:

openssl cms -sign -signer cert.pem -inkey pkey.pem -binary -in data -outform der -out signature

Если сертификат и ключ находятся в одном файле PEM (иногда удобная функция немного расширенного формата PEM для OpenSSL), укажите этот файл на -signer и опустите -inkey. Если ключ и сертификат находятся в любом формате (-ях), отличном от PEM, включая PKCS # 12, сначала конвертируйте их в PEM.

Для изменения выходного сигнала PEM на -outform pem. В OS/shell, поддерживающем перенаправление (которое, я думаю, сейчас все, кроме VMS), опускание -in или -out использует stdin или stdout соответственно, которые могут включать в себя трубопроводы от или к другим процессам. (Конечно, важно, чтобы подписанные данные были воспроизведены бит-бит для получателя/верификатора, и часто это сложнее, если оно не находится в файле.)

По умолчанию OpenSSL использует signedAttributes aka двухуровневый aka косвенная форма подписи; подписать только данные (хешированные) добавить -noattr. См. Man-страницу для получения дополнительных параметров: опустить сертификат подписчика или включить дополнительные (цепочки) сертификаты для верификатора, изменить указанные типы содержимого и подписи хеша и алгоритма.

Если вы предпочитаете писать свою собственную программу с использованием (C) API, начинайте с CMS_sign. Вы также должны быть в состоянии видеть эти (и связанные) справочные страницы локально в любой системе Unix с установленным OpenSSL, как правило, только man cms и man CMS_sign и т. Д., Хотя некоторые установки могут потребовать корректировки вашего MANPATH и/или указания специальных разделов, таких как 1ssl и 3ssl.

stackoverrun.com


Prostoy-Site | Все права защищены © 2018 | Карта сайта