Противодействие коррупции
Стандарты на ЭП являются двухуровневыми. Первый уровень представляет собой непосредственно ЭП документа (подпись с помощью закрытого ключа). Вторым уровнем называют совокупность ЭП и всех документов, необходимых для обеспечения юридической значимости ЭП: сертификат ключа, с помощью которого осуществлялось подписание, или цепочку сертификатов, время создания подписи и т.д.
Это обязывает владельца квалифицированного сертификата, например, при подаче заявления в государственный орган создать электронную подпись документа в формате PKCS#7 и подать её вместе с заявлением. Обратившееся лицо будет однозначно идентифицировано, осуществится проверка целостности и неизменности заявления с момента создания и проверка электронной подписи заявителя, которая при успешности всех предыдущих проверок будет приравнена к собственноручной подписи заявителя.
Ключ подписи и его сертификат могут распространяться в двух формах:
Файл-контейнер
Если нет желания тратиться на электронный ключ, можно получить в удостоверяющем центре ключ подписи и сертификат в виде файла-контейнера, который представляет собой программный аналог электронного ключа. Доступ к ключу подписи, содержащемуся в файле-контейнере осуществляется при помощи программного криптопровайдера с использованием пароля (доступ к ключу подписи, содержащемуся в электронном ключе осуществляется при помощи встроенного в ключ криптопровайдера с использованием пин-кода).
Внешние программы, например Microsoft Outlook, Microsoft Word/Excel или любая программа создания и проверки электроной подписи, при вызове функций подписания или проверки обращаются к части операционной системы, отвечающей за криптографию (Microsoft Crypto API), которая в зависимости от задействованных криптографических алгоритмов вызывает соответствующий криптопровайдер. В нашем случае используется отечественная криптография. Поскольку Microsoft Windows не имеет встроенной поддержки российских алгоритмов электронной подписи, следует установить криптопровайдер отечественной криптографии.
Если сертификат подписи был заранее установлен в систему (в Хранилище сертификатов), то криптопровайдер знает, в каком контейнере от какого сертификата лежит закрытый ключ, и требует от пользователя ввода пароля от этого контейнера. Если закрытый ключ расположен на электронном ключе, криптопровайдер запрашивает пин-код. При успешном вводе пароля контейнер открывается, осуществляются операции с использованием закрытого ключа, после чего контейнер закрывается.
Про использование криптопровайдера и Microsoft Outlook/Office рассказывается в статье Использование электронного ключа доступа к порталу госуслуг для осуществления электронной подписи. Если требуется создать электронную подпись произвольного документа, например, XML-формы запроса «Единого реестра доменных имен, указателей страниц сайтов в сети «Интернет» и сетевых адресов, позволяющих идентифицировать сайты в сети «Интернет», содержащие информацию, распространение которой в Российской Федерации запрещено» с сайта http://zapret-info.gov.ru, необходимо программное обеспечение с соответствующим функционалом (создание электронной подписи в формате PKCS#7).
При использовании программного криптопровайдера создание подписи с использованием квалифицированного сертификата, содержащегося в файле-контейнере и на электронном ключе ничем не отличается.
При использовании ключей подписи, содержащихся на электронных ключах, есть три варианта: использовать программный криптопровайдер (рассмотрено выше), использовать общедоступное программное обеспечение, реализующее стандартный интерфейс работы с электронными ключами PKCS#11, или создавать самописное ПО, использующее API разработчика электронного ключа. Последние два варианта используют встроенный в электронный ключ криптопровайдер.
Рассмотрим частный случай второго варианта.
OpenSUSE Linux + OpenSSL + OpenSC + Rutoken ECP
Здесь будет целесообразнее изложить материал в виде пошагового HOWTO.
1. OpenSUSE 12.2, доустанавливаем недостающее ПО
Включаем автостарт демона смарт-карт:
2. Обеспечиваем поддержку в OpenSSL электронного ключа Aktiv Rutoken ECP
Скачиваем с сайта производителя драйвера и настройки (всегда полезно поискать свежую версию):
Добавляем в исходный файл /etc/ssl/openssl.cnf секции:
Раскладываем библиотеки из архива по соответствующим каталогам, файл libp11.so.2 кладём в каталог /usr/lib/
Проверяем работоспособность электронного ключа:
Будет запрошен пин-код электронного ключа и выдан список объектов на ключе.
3. Считываем с электронного ключа сертификат подписи
Среди объектов, хранящихся на электронном ключе нас интересуют сертификат и закрытый ключ (поле ID уникально для каждой тройки объектов: открытый ключ, закрытый ключ, сертификат):
Извлекаем сертификат, который будет использоваться для подписи, в файл signer_cert.crt:
4. Создаём электронную подпись
Имеется некий файл document.txt, для которого мы хотим создать электронную подпись.
Поле -inkey e59e26a30000000020ffbbd2567ccd01 определяет ID закрытого ключа, использующегося при создании подписи.
На выходе получаем файлы: document.txt.detached.p7s, который содержит электронную подпись файла document.txt, и document.txt.attached.p7s, который содержит текст документа + его электронную подпись.
5. Проверяем электронные подписи
Примечание
17 декабря 2012 г., Лабазников Н.В., Начальник отдела сетевых технологий и информационной безопасности ООО»УЦИ»
Все права на статью принадлежат ООО «УЦИ». Разрешается копирование статьи без уведомления правообладателя. При копировании необходимо указывать ссылку на источник.
В отношении персональных данных ООО «УЦИ» придерживается политики
#Основные понятия синтаксиса криптографических сообщений PKCS 7
Функции сообщений CryptoAPI соответствуют стандарту PKCS # 7 Cryptographic Message Syntax (CMS). Разработчики должны быть знакомы с этой спецификацией, чтобы наиболее эффективно использовать низкоуровневые функции сообщений. Некоторые из его определений выделены здесь.
Тип данных, содержащихся в сообщении PKCS # 7, называется его типом содержимого. Существует два класса типов содержимого: базовый и расширенный.
Ниже приведены типы содержимого, определенные в # стандарте PKCS 7.
| Тип содержимого | Описание |
|---|---|
| Данные | Строка октета (байта). |
| Подписанные данные | Содержимое любого типа и хэшей зашифрованных сообщений (дайджестов) содержимого для одного или нескольких подписывания. |
| Запечатанные данные | Зашифрованное содержимое любого типа и зашифрованные ключи шифрования содержимого для одного или нескольких получателей. Сочетание зашифрованного содержимого и зашифрованного ключа шифрования содержимого для получателя является цифровым конвертом для этого получателя. |
| Данные, подписанные и запечатанные | Зашифрованное содержимое любого типа, зашифрованные ключи шифрования содержимого для одного или нескольких получателей и алгоритмы шифрованных сообщений с удвоенной шифрованием для одного или нескольких подписывающих лиц. Двойное шифрование состоит из шифрования с закрытым ключом и шифрованием с помощью ключа шифрования содержимого. |
| Дайджест-данные | Содержимое любого типа и хэш сообщения (дайджест) содержимого. |
| Зашифрованные данные | Зашифрованное содержимое любого типа. В отличие от типа содержимогос оболочкой, тип содержимого зашифрованных данных не имеет ни получателей, ни зашифрованных ключей шифрования содержимого. Предполагается, что ключи управляются другими способами. |
Форматы электронной подписи
Статья посвящена обзору стандартов СMS (Cryptographic Message Syntax) для подписанных сообщений.
Для чего нужен CMS
Чтобы не путаться в терминологии, далее исходные данные, которые мы хотим передать защищенным способом, будут называться данными, а получившееся защищенное сообщение CMS – просто сообщением.
Стандарт CMS (PKCS #7 и RFC 5652): теория
Чуть истории
Подпись в CMS-формате (signed data type)
Подписанное Алисой сообщение в формате CMS будет иметь следующий вид (серым отмечены необязательные атрибуты):
CMS предлагает два интересных атрибута, расширяющих возможности обычной подписи: время подписи (Signing Time) и контрасигнатуру (Countersignature). Первый атрибут определяет предполагаемое время осуществления подписи, а второй предназначен для подписи другой подписи (подписывается хеш от значения подписи). Атрибут Countersignature представляет собой структуру Signer Info с отсутствующим в Signed Attributes атрибутом Content Type и обязательно присутствующим атрибутом Message Digest. Атрибут Countersignature может иметь свой собственный атрибут Countersignature.
Если Боб решит подписать только данные, переданные Алисой, и заодно подписать подпись Алисы, то сообщение будет иметь такой вид:
Галопом по Европам оставшимся типам
СMS предлагает еще несколько интересных типов сообщений, не охватываемых темой этой статьи. Поэтому буквально по паре слов об оставшихся типах для общей картины.
Упакованные данные (enveloped data) представляют собой зашифрованные данные вместе с зашифрованными для одного или более получателей ключами, которыми эти данные были зашифрованы. Комбинация зашифрованного сообщения с одним зашифрованным ключом шифрования для одного получателя называется цифровым конвертом. Данный тип используется в качестве конверта с (подписанными) данными для одного или нескольких получателей.
Хешированные данные (данные вместе со своим хешем) используются для проверки целостности сообщения и часто являются содержимым упакованных данных.
Зашифрованные данные часто используются для шифрования данных для локального хранилища, иногда с выработанным из пароля ключом шифрования.
Данные из аутентифицированного источника (данные с проверкой подлинности) включают в себя данные вместе с их MAC-кодом и зашифрованными ключами аутентификации для одного или нескольких получателей. Используются для защиты целостности сообщений для неограниченного количества получателей.
В следующей статье мы подробно остановимся на сообщениях типа enveloped data с использованием российских криптоалгоритмов.
CMS в реальной жизни
Как реализовать на практике?
Наша компания поддержала CMS c российской криптографией в продукте Рутокен Плагин. Рутокен Плагин предназначен для использования в браузерах, все криптографические операции производятся аппаратно, «на борту» USB-токена.
Структура PKCS7-файла
Довелось мне на днях столкнуться с такой напастью как p7s файл и, как вследствие этого, с Cryptographic Message Syntax (CMS). На хабре нашлась интересная статья описывающая структуру CMS данных, но в ней к сожалению нет примера, позволяющего наглядно продемонстрировать CMS на практике. Я хочу немного дополнить ту статью и разобрать внутренности файла цифровой подписи p7s.
Что же такое Cryptographic Message Syntax? Это стандарт, описывающий структуру сообщений, полученных с использованием криптографии.
В стандарте описывается шесть типов данных: data, signedData, envelopedData, signedAndEnvelopedData, digestedData, and encryptedData. В данном топике я расскажу о типе signedData (данные с электронной подписью).
Прежде всего следует сказать, что стандартный p7s файл имеет ASN.1 структуру.
ASN.1 — формат записи, с помощью которого можно описывать сложные структуры данных, состоящие из различных типов.
Приведу краткую выдержку из своего старого топика про x.509 сертификаты:
ASN.1-кодировка описывается следующим правилом. Сперва записываются байты, характеризующий тип данных, затем последовательность байтов хранящих сведения о длине данных и лишь после этого следуют сами данные.
К примеру, для кодировки целого числа INTEGER 65537 используется следующая форма: 02 03 01 00 01.
Здесь первый байт 02, определяет тип INTEGER (полную таблицу типов вы можете найти например тут), второй байт 03 показывает длину блока. А следующие за этим байты 01 00 01, являются шестнадцатеричной записью нашего числа 65537.
В нашем случае, для описание простейшего самоподписанного сертификата, достаточно 9 типов данных. Приведем таблицу кодирования для этих типов:
| Наименование типа | Краткое описание | Представление типа в DER-кодировке |
|---|---|---|
| SEQUENCE | Используется для описания структуры данных, состоящей из различных типов. | 30 |
| INTEGER | Целое число. | 02 |
| OBJECT IDENTIFIER | Последовательность целых чисел. | 06 |
| UTCTime | Временной тип, содержит 2 цифры для определения года | 17 |
| GeneralizedTime | Расширенный временной тип, содержит 4 цифры для обозначения года. | 18 |
| SET | Описывает структуру данных разных типов. | 31 |
| UTF8String | Описывает строковые данные. | 0C |
| NULL | Собственно NULL | 05 |
| BIT STRING | Тип для хранения последовательности бит. | 03 |
Структура P7S файла
В стандарте CMS приводится описание структуры файла содержащего сведения об ЭЦП.
Используя ASN.1-парсер можно легко разобрать что скрывается за шестнадцатеричным кодом.
Этот пример отличается от предыдущего наличием дополнительного блока:
Именно в нем содержатся SignedAttributes. Помимо двух обязательных атрибутов при подписи был использован атрибут signedTime, который хранит время подписи.
Форматы электронной подписи
Статья посвящена обзору стандартов СMS (Cryptographic Message Syntax) для подписанных сообщений.
Для чего нужен CMS
Стандарт CMS описывает структуру криптографических сообщений, включающих в себя защищенные данные вместе со сведениями, необходимыми для их корректного открытия или использования. Например, в сообщении размещаются защищенные данные, информация об алгоритме хеширования и подписи, времени подписи, сертификате открытого ключа, цепочке сертификации и т.д. Некоторые из указанных атрибутов носят опциональный характер, но приложение может само определить необходимость их наличия. У каждого алгоритма есть набор параметров, который должен быть согласован на обеих сторонах: для ГОСТ 34.10-2001, помимо открытого ключа, это модуль p, коэффициенты эллиптической кривой a и b и порядок циклической подгруппы точек эллиптической кривой q. И все это нужно каким-то образом передать адресату сообщения.
RSA Laboratories в серии своих стандартов криптографии с открытом ключом (PKCS) предложила решение этой проблемы путем определения синтаксиса для защищенных сообщений в следующих стандартах:
Развитием этих стандартов стал стандарт CMS. CMS кроме определенной заголовком статьи подписи поддерживает операции шифрования, хеширования и вычисления имитовставки, в том числе и по российским алгоритмам (RFC 4490), а также множественную инкапсуляцию. Последнее означает, что сообщение формата CMS может лежать внутри другого CMS сообщения.
Всего CMS поддерживает шесть типов данных:
● просто данные (data);
● данные с электронной подписью (signed data);
● упакованные данные (enveloped data);
● хешированные данные (digested data);
● зашифрованные данные (encrypted data);
● данные с проверкой подлинности (authenticated data).
В рамках статьи мы подробно рассмотрим только данные с электронной подписью (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 Version зависит от сертификатов, типа подписываемых данных и информации о подписывающих сторонах;
● Digest Algorithms включает в себя идентификаторы используемых алгоритмов хеширования и ассоциированные с ними параметры;
● Encapsulated Content содержит подписываемые данные (Content) вместе с их типом (Content Type). Содержимое может отсутствовать, тип – нет;
● Certificates предназначен для цепочки сертификатов, отражающих путь сертификации от центра сертификации, выдавшего сертификат, до каждой из подписывающих сторон. Также могут присутствовать сертификаты подписывающих сторон;
● CRLs (Certificate Revocation List) предоставляет информацию о статусе отзыва сертификатов, достаточную для определения валидности сертификата подписывающей стороны;
● информация о каждой подписывающей стороне содержится в структурах типа Signer Info, которых может быть любое количество, в том числе и нулевое (в случае отсутствия подписи);
● версия синтаксиса CMS Version определяется значением Signer ID;
● Signer ID определяет открытый ключ подписывающей стороны (subjectKeyIdentifier) или сертификат его открытого ключа, необходимый для проверки подлинности подписи (issuerAndSerialNumber);
● Digest Algorithm определяет алгоритм хеширования и все ассоциированные с ним параметры, используемые подписывающей стороной;
● в Signed Attributes помещаются атрибуты, требующие подписи. Поле может отсутствовать только при подписи простых данных (Content Type = id-data), при подписи других данных (например, Content Type = id-SignedData) должно присутствовать с как минимум двумя обязательными атрибутами – типом (Content Type) и хешем данных (Message Digest);
● Signature Algorithm содержит идентификатор алгоритма подписи вместе с его параметрами;
● в Signature Value помещается значение подписанного закрытым ключом хеша от данных (Content) и атрибутов для подписи (Signed Attributes);
● в Unsigned Attributes помещаются оставшиеся атрибуты, не требующие подписи.
Если Боб решает целиком подписать полученное от Алисы сообщение, то используется механизм инкапсуляции, и сообщение будет выглядеть вот так:
CMS предлагает два интересных атрибута, расширяющих возможности обычной подписи: время подписи (Signing Time) и контрасигнатуру (Countersignature). Первый атрибут определяет предполагаемое время осуществления подписи, а второй предназначен для подписи другой подписи (подписывается хеш от значения подписи). Атрибут Countersignature представляет собой структуру Signer Info с отсутствующим в Signed Attributes атрибутом Content Type и обязательно присутствующим атрибутом Message Digest. Атрибут Countersignature может иметь свой собственный атрибут Countersignature.
Если Боб решит подписать только данные, переданные Алисой, и заодно подписать подпись Алисы, то сообщение будет иметь такой вид:
Галопом по Европам оставшимся типам
СMS предлагает еще несколько интересных типов сообщений, не охватываемых темой этой статьи. Поэтому буквально по паре слов об оставшихся типах для общей картины.
Упакованные данные (enveloped data) представляют собой зашифрованные данные вместе с зашифрованными для одного или более получателей ключами, которыми эти данные были зашифрованы. Комбинация зашифрованного сообщения с одним зашифрованным ключом шифрования для одного получателя называется цифровым конвертом. Данный тип используется в качестве конверта с (подписанными) данными для одного или нескольких получателей.
Хешированные данные (данные вместе со своим хешем) используются для проверки целостности сообщения и часто являются содержимым упакованных данных.
Зашифрованные данные часто используются для шифрования данных для локального хранилища, иногда с выработанным из пароля ключом шифрования.
Данные из аутентифицированного источника (данные с проверкой подлинности) включают в себя данные вместе с их MAC-кодом и зашифрованными ключами аутентификации для одного или нескольких получателей. Используются для защиты целостности сообщений для неограниченного количества получателей.
В следующей статье мы подробно остановимся на сообщениях типа enveloped data с использованием российских криптоалгоритмов.
CMS в реальной жизни
Стандарт CMS имеет немало воплощений в современном мире IT – на нем основаны:
● стандарт защищенной электронной почты S/MIME (RFC 3851),
● расширенные сервисы защиты для S/MIME (RFC 2634, кстати, тут описаны дополнительные атрибуты CMS и технология тройного «обертывания» на основе множественной инкапсуляции: данные подписываются, затем шифруются и снова подписываются),
● расширенные форматы представления информации об аннулированных сертификатах (RFC 5940) и пр.
Закономерным развитием идей CMS для сообщений с электронной подписью cтал CAdES (CMS Advanced Electronic Signature), расширенный стандарт подписанных сообщений CMS, который также послужит темой для еще одной нашей статьи.
Как реализовать на практике?
Предложения и варианты практических решений ищите в полном тексте статьи.
Спасибо за предоставленный материал Компании «Актив».












