Создание отдельного файла подписи (.sig) для PDF
Файл .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от разных подписантов, не создавая конфликтующих полей внутри документа. - Совместимость с ЭДО: Многие российские и зарубежные системы ЭДО требуют именно отдельный файл подписи для юридической значимости обмена.
Технические требования и форматы
Для корректной работы отдельной подписи необходимо соблюдение следующих условий:
- Формат контейнера: Стандарт де-факто — CMS (Cryptographic Message Syntax) или его предшественник PKCS#7. Файл
.sigсодержит саму подпись, сертификат подписанта и, опционально, цепочку сертификатов УЦ. - Алгоритм хеширования: Рекомендуется использовать SHA-256 или выше. MD5 и SHA-1 считаются устаревшими и небезопасными.
- Привязка к файлу: Подпись вычисляется на основе байтового содержимого PDF. Любое изменение в PDF (даже добавление пробела) сделает подпись невалидной.
Важно: Файл .sig не является самодостаточным для визуального отображения подписи в читалках PDF (например, Adobe Acrobat). Он предназначен для программной проверки через специализированное ПО или скрипты验证.
Пошаговая инструкция с использованием OpenSSL
Ниже приведен пример создания самоподписанного сертификата (для тестирования) и формирования файла .sig. В продуктивной среде используйте квалифицированные сертификаты от аккредитованных УЦ.
Шаг 1. Подготовка инструментов
Убедитесь, что у вас установлен OpenSSL версии 1.1.1 или выше.
Подготовьте PDF-документ, например contract.pdf.
Шаг 2. Генерация ключей и сертификата (тестовый режим)
Если у вас уже есть пара ключ/сертификат (в форматах .pem, .key, .crt), перейдите к шагу 3.
- Создайте закрытый ключ 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
- Изменение PDF после подписания.
Если вы открыли PDF в редакторе, сохранили его и затем попытались проверить старый
.sig, проверка упадет. Даже метаданные (дата открытия) могут изменить байты файла.
Всегда проверяйте подпись на той же копии файла, которая была подписана. Используйте контрольные суммы (MD5/SHA256) для сверки идентичности файлов перед проверкой.
- Несоответствие форматов (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 по ГОСТ). Сам факт отделения подписи от документа не лишает её юридической силы, если обеспечена целостность связки «документ + подпись».