Создание отдельного файла подписи (.sig) для PDF

Иван Корнев·26.05.2026·4 мин

Файл .sig — это контейнер с криптографической подписью (обычно в формате CMS/PKCS#7), который хранится отдельно от самого PDF-документа. Чтобы создать такой файл, необходимо сгенерировать хеш PDF-документа, подписать его закрытым ключом и сохранить результат в бинарном или Base64-формате с расширением .sig. Это позволяет проверять подлинность документа без изменения его содержимого, что критично для систем электронного документооборота (ЭДО) и архивного хранения.

Краткий ответ: Используйте утилиту OpenSSL для создания detached-подписи. Команда openssl cms -sign -in document.pdf -binary -signer cert.pem -inkey key.pem -outform DER -out document.sig создаст отдельный файл подписи, привязанный к исходному PDF.

Зачем разделять подпись и документ

В классическом PDF подпись часто встраивается внутрь файла (incremental update). Однако в корпоративных и государственных системах нередко требуется схема «отсоединенной подписи» (detached signature).

Основные преимущества формата .sig:

  • Целостность оригинала: Исходный PDF не модифицируется. Его хеш-сумма остается неизменной, что упрощает сверку с оригиналом на любом этапе.
  • Гибкость хранения: Подписи можно хранить в отдельном реестре или базе данных, не увеличивая вес самих документов.
  • Множественные подписи: К одному PDF можно приложить несколько файлов .sig от разных подписантов, не создавая конфликтующих полей внутри документа.
  • Совместимость с ЭДО: Многие российские и зарубежные системы ЭДО требуют именно отдельный файл подписи для юридической значимости обмена.

Технические требования и форматы

Для корректной работы отдельной подписи необходимо соблюдение следующих условий:

  1. Формат контейнера: Стандарт де-факто — CMS (Cryptographic Message Syntax) или его предшественник PKCS#7. Файл .sig содержит саму подпись, сертификат подписанта и, опционально, цепочку сертификатов УЦ.
  2. Алгоритм хеширования: Рекомендуется использовать SHA-256 или выше. MD5 и SHA-1 считаются устаревшими и небезопасными.
  3. Привязка к файлу: Подпись вычисляется на основе байтового содержимого PDF. Любое изменение в PDF (даже добавление пробела) сделает подпись невалидной.

Важно: Файл .sig не является самодостаточным для визуального отображения подписи в читалках PDF (например, Adobe Acrobat). Он предназначен для программной проверки через специализированное ПО или скрипты验证.

Пошаговая инструкция с использованием OpenSSL

Ниже приведен пример создания самоподписанного сертификата (для тестирования) и формирования файла .sig. В продуктивной среде используйте квалифицированные сертификаты от аккредитованных УЦ.

Шаг 1. Подготовка инструментов

Убедитесь, что у вас установлен OpenSSL версии 1.1.1 или выше. Подготовьте PDF-документ, например contract.pdf.

Шаг 2. Генерация ключей и сертификата (тестовый режим)

Если у вас уже есть пара ключ/сертификат (в форматах .pem, .key, .crt), перейдите к шагу 3.

  1. Создайте закрытый ключ RSA 2048 бит:
    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
    ```

2.  Создайте запрос на сертификат (CSR) и самоподписанный сертификат сроком на 1 год:
    
```bash
    openssl req -new -x509 -key private_key.pem -out certificate.pem -days 365 -subj "/CN=Test Signer/O=My Company/C=RU"
    ```

### Шаг 3. Создание файла подписи .sig

Используйте команду `cms` для формирования отсоединенной подписи. Ключ `-binary` критически важен для PDF, так как предотвращает трансляцию символов новой строки, что исказило бы хеш.


```bash
openssl cms -sign \
  -in contract.pdf \
  -binary \
  -signer certificate.pem \
  -inkey private_key.pem \
  -outform DER \
  -out contract.sig

Разбор параметров:

  • -in contract.pdf: исходный документ.
  • -binary: указывает, что файл бинарный (не текстовый).
  • -signer и -inkey: сертификат и закрытый ключ подписанта.
  • -outform DER: сохраняет подпись в бинарном формате (стандарт для .sig). Можно использовать PEM, если того требует ваша система.
  • -out contract.sig: итоговый файл подписи.

Шаг 4. Проверка валидности подписи

Что убедиться, что подпись создана корректно и соответствует документу, выполните верификацию:

openssl cms -verify \
  -in contract.sig \
  -inform DER \
  -content contract.pdf \
  -CAfile certificate.pem \
  -purpose any

Если команда выводит Verification successful и содержимое файла на экран (или в указанный выходной файл), подпись валидна.

Альтернативные инструменты

Помимо OpenSSL, создание .sig может выполняться другими средствами:

ИнструментСценарий использованияОсобенность
CryptoPro CSPРабота с ГОСТ-алгоритмами (РФ)Требует установки КриптоПро. Использует утилиты csign или API для создания подписи в формате CMS.
Java Bouncy CastleИнтеграция в backend-приложенияБиблиотека позволяет программно создавать CMS-подписи внутри Java-кода.
Adobe Acrobat ProЭкспорт подписиПозволяет экспортировать встроенную подпись, но чаще используется для создания PAdES (внутри PDF), а не отдельного .sig.

Частые ошибки при работе с .sig

  1. Изменение PDF после подписания. Если вы открыли PDF в редакторе, сохранили его и затем попытались проверить старый .sig, проверка упадет. Даже метаданные (дата открытия) могут изменить байты файла.
Всегда проверяйте подпись на той же копии файла, которая была подписана. Используйте контрольные суммы (MD5/SHA256) для сверки идентичности файлов перед проверкой.
  1. Несоответствие форматов (DER vs PEM). Некоторые системы ожидают текстовый файл (PEM, начинается с -----BEGIN CMS-----), другие — бинарный (DER). Уточняйте требования принимающей стороны. Конвертация возможна через OpenSSL:
    openssl cms -in signature.sig -inform DER -outform PEM -out signature.pem
    ```

3.  **Отсутствие цепочки сертификатов в .sig.**
    Если в файл `.sig` не включены промежуточные сертификаты УЦ, проверяющая сторона должна иметь их локально. Для включения цепочки добавьте флаг `-certfile intermediate_ca.pem` при создании подписи.

## FAQ

**Можно ли открыть файл .sig в браузере?**
Нет, браузеры не предназначены для чтения бинарных CMS-контейнеров. Для просмотра содержимого (сертификата, даты подписи) используйте специальные утилиты или онлайн-декодеры ASN.1.

**Чем .sig отличается от .p7s?**
Технически это часто один и тот же формат (CMS/PKCS#7). Расширение `.p7s` традиционно используется в почте (S/MIME), а `.sig` — в файловых операциях и ЭДО. Содержимое может быть идентичным.

**Юридически ли значима отдельная подпись .sig?**
Да, если она создана с использованием квалифицированной электронной подписи (КЭП) и соответствует законодательству вашей страны (в РФ — 63-ФЗ, формат CMS по ГОСТ). Сам факт отделения подписи от документа не лишает её юридической силы, если обеспечена целостность связки «документ + подпись».