Формат подписи PKCS #7: как создать и проверить

0
32

Что такое PKCS#7: структура и назначение

Криптографические токены PKCS# 11. Графическая утилита \ - изображение номер один
Криптографические токены PKCS# 11. Графическая утилита \ — изображение номер один

Подпись pkcs 7 представляет собой криптографический контейнер, разработанный компанией RSA Laboratories. Его главная задача — упаковка данных цифровой подписи вместе с сертификатами и информацией об алгоритмах. Внутри такого контейнера могут находиться как подписанные сообщения, так и зашифрованные объекты.

Структура формата базируется на стандарте ASN.1 и использует кодировку DER. Основные компоненты:

  • Версия протокола (обычно 1 или 2)
  • Набор алгоритмов хеширования и шифрования
  • Цепочка сертификатов (опционально)
  • Сама подпись в бинарном виде

Этот вариант часто применяется в электронном документообороте, где требуется проверка авторства данных без передачи самого файла. Подпись pkcs 7 может быть как вложенной (attached), так и отдельной (detached) — во втором случае она существует независимо от исходного документа.

Основные компоненты SignedData

Криптографические токены PKCS# 11. Графическая утилита \ - изображение номер два
Криптографические токены PKCS# 11. Графическая утилита \ — изображение номер два

Структура SignedData из спецификации PKCS#7 включает несколько обязательных и опциональных полей. Ключевые элементы:

  • version — версия синтаксиса (для данного типа всегда 1).
  • digestAlgorithms — набор идентификаторов алгоритмов хеширования, используемых при подписании.
  • contentInfo — контейнер с самими данными (тип и содержимое).
  • certificates — необязательный набор сертификатов открытых ключей, удостоверяющих подписантов.
  • crls — опциональный перечень отозванных сертификатов.
  • signerInfos — коллекция подписей, каждая из которых привязана к конкретному сертификату и алгоритму.

Вся эта конструкция упаковывается в DER- или BER-кодировку, образуя законченный блок подписи.

Отличие PKCS#7 от других криптоформатов

An Introduction to Digital Signatures and PKCS #7 - изображение номер три
An Introduction to Digital Signatures and PKCS #7 — изображение номер три

Стандарт PKCS#7 заметно выделяется среди аналогов своей архитектурой. В отличие от CMS (Cryptographic Message Syntax), которая пришла ему на смену в более новых спецификациях, оригинальный формат RFC 2315 жестко привязан к синтаксису ASN.1 и использует исключительно DER-кодировку. Если сравнивать его с XMLDSig, то здесь нет громоздкой разметки — данные упакованы в бинарный контейнер. Отдельного упоминания заслуживает сравнение с OpenPGP: в PKCS#7 поддерживается вложение сертификатов прямо в сообщение, а не только ссылки на них. Итоговая модель оказалась настолько удачной, что легла в основу многих отраслевых решений, включая форматы подписей в электронном документообороте.

Как создать подпись PKCS#7

Чтобы разобраться, как применить формат pkcs 7 как создать на практике, потребуется утилита для работы с сертификатами (например, OpenSSL). Сам процесс состоит из нескольких последовательных операций.

  • Подготовка данных — исходный файл (документ, бинарный образ) нужно привести к байтовому представлению.
  • Выбор типа подписи — решите, будет ли она присоединённой (attached) или откреплённой (detached). Для электронного документооборота чаще берут второй вариант — он оставляет исходный файл нетронутым.
  • Формирование — утилита берёт хеш от данных, шифрует его закрытым ключом и упаковывает результат в контейнер ASN.1 вместе с цепочкой сертификатов.

В итоге на выходе получается файл с расширением .p7s или .p7b. Для верификации потребуется только открытый ключ отправителя.

Формирование подписи через OpenSSL

What Is the PKCS7 File Format? Baeldung on Computer Science - изображение номер четыре
What Is the PKCS7 File Format? Baeldung on Computer Science — изображение номер четыре

Для создания криптографической конструкции, известной как pkcs 7 формат подписи, в среде Linux удобно использовать утилиту openssl. Ниже приведен типовой двухшаговый алгоритм.

  • Шаг 1. Генерация ключей и самоподписанного сертификата:
    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
  • Шаг 2. Подписание файла data.txt с выводом результата в DER-кодировке:
    openssl smime -sign -in data.txt -out signed.p7s -signer cert.pem -inkey key.pem -outform DER

На выходе получается бинарный контейнер, соответствующий стандарту PKCS#7. Для проверки такой подписи используется команда openssl smime -verify.

Подпись PKCS#7 sig: работа с detached-режимом

Криптографический АРМ на базе токенов PKCS# 11. Электронная подпись. Часть 2 / Х - изображение номер пять
Криптографический АРМ на базе токенов PKCS# 11. Электронная подпись. Часть 2 / Х — изображение номер пять

Отдельная (detached) подпись pkcs 7 sig представляет собой вариант, при котором файл с подписью и исходные данные хранятся раздельно. Такой подход часто применяется при передаче больших объёмов информации, когда нет необходимости дублировать содержимое.

ЧИТАЙТЕ ТАКЖЕ:  Системный монитор Astra Linux: полный обзор и настройка

Ключевые особенности detached-режима:

  • Файл подписи имеет расширение .p7s и содержит только криптографический блок.
  • Проверка целостности выполняется только при наличии обоих элементов — подписи и исходного документа.
  • Используется в электронном документообороте, например, в форматах CAdES.

Для работы с таким вариантом требуются утилиты, поддерживающие раздельное хранение. Например, в OpenSSL команда openssl smime -verify -in signature.p7s -content data.txt -inform DER -noverify позволяет проверить корректность.

Разбор формата PKCS#7: внутреннее устройство

Криптографические токены PKCS# 11. Графическая утилита \ - изображение номер шесть
Криптографические токены PKCS# 11. Графическая утилита \ — изображение номер шесть

PKCS#7 — это не просто контейнер, а строгая структура данных, описанная на языке ASN.1. Она определяет, как именно упаковывается подпись, сертификаты и информация об авторах документа. В основе лежит тип ContentInfo, который содержит идентификатор типа контента и сами данные.

Ключевая особенность — гибкость. Спецификация позволяет хранить как просто подписанные сообщения (signedData), так и зашифрованные данные (envelopedData). Рассмотрим основные элементы на примере signedData:

  • Версия — указывает на версию синтаксиса (обычно 1 для PKCS#7 v1.5).
  • Набор дайджестов — хеш-функции, использованные для вычисления подписи (например, SHA-256).
  • Данные — само подписываемое содержимое (может быть пустым, если подпись отсоединённая).
  • Подписанты — список, где каждый элемент содержит идентификатор подписанта, алгоритм подписи и саму подпись.
  • Сертификаты — цепочка X.509 для проверки подлинности подписантов.

Самое интересное — это рекурсивная природа формата. Внутри одного контейнера могут быть вложены другие структуры PKCS#7, что позволяет создавать сложные иерархические подписи. Например, контракт может быть подписан сначала юристом, а затем генеральным директором, и оба слоя будут упакованы в один файл. Это отличает PKCS#7 от более простых форматов, где подпись просто прикрепляется к документу.

Типы контента в SignedData

What Is the PKCS7 File Format? Baeldung on Computer Science - изображение номер семь
What Is the PKCS7 File Format? Baeldung on Computer Science — изображение номер семь

Внутри структуры SignedData, описанной стандартом PKCS#7, могут находиться различные типы данных. Основной вариант — это data, представляющий собой произвольный набор байт (например, файл или сообщение). Однако спецификация допускает и другие форматы, такие как signedData (вложение одной подписи в другую) или encryptedData. Выбор конкретного типа влияет на то, как утилиты будут интерпретировать полезную нагрузку при проверке.

Поля сертификатов и CRL

Криптографический АРМ на базе стандартов с открытым ключом. Конфигурирование ток - изображение номер восемь
Криптографический АРМ на базе стандартов с открытым ключом. Конфигурирование ток — изображение номер восемь

В структуре PKCS#7 сертификаты и списки отзыва (CRL) размещаются в контейнере SetOfCertificateChoices. Каждый сертификат X.509 содержит набор полей, включая серийный номер, издателя и срок действия. CRL, в свою очередь, фиксирует отозванные экземпляры по их идентификаторам.

Поле Описание
Issuer Указывает на центр сертификации
Validity Ограничивает период применения
CRL Number Порядковый номер редакции списка

Эти элементы обеспечивают проверку цепочки доверия без внешних запросов.

Практические примеры создания и проверки

Для работы с PKCS#7 на практике часто применяется утилита OpenSSL. Команда ниже создаёт отдельный файл подписи в DER-кодировке:

  1. Подготовьте закрытый ключ (key.pem) и сертификат (cert.pem).
  2. Выполните: openssl smime -sign -in document.txt -out signature.p7s -signer cert.pem -inkey key.pem -outform DER.
  3. Проверка делается так: openssl smime -verify -in signature.p7s -content document.txt -inform DER -CAfile ca.pem.

Если подпись валидна, утилита выведет исходный текст. В противном случае появится сообщение об ошибке с указанием причины — несовпадение хеша или проблемы с цепочкой сертификатов.

Генерация подписи из командной строки

Использование механизмов криптографических токенов PKCS# 11 в скриптовых языках / Habr - изображение номер девять
Использование механизмов криптографических токенов PKCS# 11 в скриптовых языках / Habr — изображение номер девять

Для создания подписи в формате PKCS#7 через терминал чаще всего применяют утилиту openssl. Процесс обычно выглядит так:

  • Подготовка ключей: необходим закрытый ключ и сертификат отправителя.
  • Выполнение команды: openssl smime -sign -in document.txt -out signed.p7s -signer cert.pem -inkey key.pem.
  • Результат: на выходе получается файл с расширением .p7s, содержащий подписанные данные.

Такой метод удобен для автоматизации и пакетной обработки документов.

Проверка целостности подписи PKCS#7

Криптографический АРМ на базе токенов PKCS# 11. Электронная подпись. Часть 2 - изображение номер десять
Криптографический АРМ на базе токенов PKCS# 11. Электронная подпись. Часть 2 — изображение номер десять

Верификация цифровой подписи в данном формате — это многошаговая процедура, направленная на подтверждение того, что документ не подвергался изменениям после его заверения. Процесс включает три последовательных этапа:

  • Криптографическая проверка: расшифровка хеша открытым ключом отправителя и сравнение полученного значения с самостоятельно вычисленным хешем исходных данных.
  • Валидация цепочки сертификатов: построение и проверка пути сертификации до доверенного корневого центра, включая статус отзыва каждого звена.
  • Анализ атрибутов подписывающего: при наличии signed-атрибутов (время, политика) их целостность также подтверждается.

Если на любом из этапов возникает несоответствие — подпись признаётся недействительной. Стоит отметить, что сам контейнер PKCS#7 (он же CMS) лишь инкапсулирует данные, но не гарантирует актуальности сертификатов на момент проверки — это задача инфраструктуры открытых ключей (PKI).