Проверка подписи PDF Что нужно знать разработчикам
Большинство разработчиков сталкиваются с подписанными PDF-файлами, не понимая, что гарантирует криптографическая подпись. Вот то, что нужно знать для корректной проверки подписи PDF.
Большинство разработчиков работали с подписанными PDF-файлами — соглашениями, подтверждёнными банковскими выписками, правительственными формами. Но понятие «подписано» может иметь разное значение в зависимости от того, кто его объясняет. Визуальный след в ячейке подписи и криптографическая подпись, встроенная в файл, — это совершенно разные вещи. Только одна из них действительно гарантирует что-то.
В этом руководстве рассмотрены принципы работы цифровых подписей PDF, различные состояния их достоверности и способы программной проверки.
Та подпись, которую вы видите, и та, которая важна
Когда кто-то «подписывает» PDF с помощью инструмента или изображения, он просто помещает изображение подписи на страницу. Оно выглядит официально, но не обеспечивает никакой безопасности. Кто угодно может скопировать это изображение в другой документ.
Цифровая подпись — это что-то иное. Это криптографический объект, встроенный в саму структуру PDF — отделённый от любых визуальных элементов. Когда документ подписывается цифровым способом:
- Вычисляется хэш содержимого документа.
- Этот хэш шифруется с помощью приватного ключа подписывающего.
- Зашифрованный хэш (подпись) сохраняется в PDF вместе с цепочкой сертификатов подписывающего.
При проверке подписи вы дешифруете её с помощью публичного ключа из сертификата, пересчитываете хэш из текущего содержимого документа и сравниваете. Если они совпадают, документ не был изменён с момента подписания. Если они не совпадают — или сертификат не доверен — подпись считается недействительной.
Четыре состояния достоверности подписи
Не все цифровые подписи одинаковы. При проверке подписи PDF вы можете столкнуться с одним из четырёх состояний:
| Состояние подписи | Что это означает | Что делать |
|---|---|---|
| Валидный | Хэш совпадает, цепочка сертификатов доверена, сертификат был активен в момент подписания | Доверяйте подписи — проверяйте идентичность подписывающего против ожидаемого сертификата |
| Недействительная | Содержимое документа было изменено после подписания, или данные подписи повреждены | Отклоняйте документ; он был изменён или имеет неправильную структуру |
| Неизвестная | Структура подписи целая, но сертификат не может быть проверен (недоверенный корень, отсутствует OCSP и т.д.) | Не доверяйте подписи — запросите переподпись или получите доверенный корневой сертификат |
| Отозван | Сертификат был действительным при выдаче, но позже был отозван CA (например, из-за утечки ключа) | Отклоняйте, если данные LTV не подтверждают, что сертификат был действительным до отзыва |
Состояние «Неизвестно» часто вызывает трудности у разработчиков. Структурно правильная подпись с самоподписанной или внутренней корпоративной подписью отображается как «Неизвестно» в большинстве инструментов, потому что эти инструменты не могут достичь издателя. В внутренних рабочих процессах вы можете явно доверять этому корню; для документов от внешних сторон состояние «Неизвестно» не приемлемо.
Долгосрочная проверка (LTV): Почему важны временные метки
Сертификаты истекают. Если кто-то подписал документ пять лет назад, а его сертификат уже истёк, сохраняется ли подпись?
Это зависит от долгосрочной проверки (LTV). При наличии LTV в PDF содержится:
- Доверенный временной метки от временной аутентификационной службы (TSA)
- Ответы OCSP или данные CRL, подтверждающие статус сертификата в момент подписания
С LTV вы можете доказать, что сертификат был действительным в момент подписания — даже после истечения срока. Без LTV вы можете проверить только подпись по текущему статусу сертификата, что становится невозможным, когда сертификат истёк или OCSP-сервер прекращает работу.
Для договоров или регулируемых документов с длительным сроком хранения (7+ лет в многих юрисдикциях) LTV не является опциональным. Всегда проверяйте его при создании рабочих процессов по проверке подписей.
Программная проверка подписей PDF
Использование Python с pypdf
The pypdf библиотека предоставляет доступ к полям подписи PDF и их внутренней метаданных. Ниже приведён минимальный пример для проверки наличия цифровых подписей и чтения их состояния:
import sys
from pypdf import PdfReader
def check_pdf_signatures(path: str) -> None:
reader = PdfReader(path)
sig_fields = [
name for name, field in (reader.get_fields() or {}).items()
if field.get("/FT") == "/Sig"
]
if not sig_fields:
print("No digital signature fields found.")
return
print(f"Found {len(sig_fields)} signature field(s):")
for name in sig_fields:
sig_obj = reader.get_fields()[name]
sig_dict = sig_obj.get("/V")
if not sig_dict:
print(f" {name}: field present but unsigned")
continue
signer_name = sig_dict.get("/Name", "Unknown")
signing_time = sig_dict.get("/M", "No timestamp")
reason = sig_dict.get("/Reason", "")
location = sig_dict.get("/Location", "")
print(f" {name}:")
print(f" Signer: {signer_name}")
print(f" Time: {signing_time}")
if reason:
print(f" Reason: {reason}")
if location:
print(f" Location: {location}")
if __name__ == "__main__":
check_pdf_signatures(sys.argv[1])
Это читает метаданные подписи напрямую из структуры PDF. Для полной криптографической проверки — подтверждения хэша и проверки цепочки сертификатов — используйте pyhanko или endesive, обе из которых обёртывают слой проверки PKCS#7.
Использование qpdf в командной строке
Для быстрой проверки из командной строки без установки среды Python:
# Show encryption and signature info
qpdf --show-encryption input.pdf
# Full JSON output with signature details
qpdf --json input.pdf | python3 -m json.tool | grep -A 20 '"sig"'
qpdf полезно в CI-трубинах или скриптах, где настройка виртуального окружения Python добавляет излишнюю нагрузку.
Общие сценарии проверки
Подписанные контракты от клиентов — Проверяйте как состояние достоверности, так и имя эмитента сертификата. Действительная подпись от недоверенного корня (самоподписанного сертификата) не даёт внешних гарантий. Вы доверяете тем, кто создал ключ.
Государственные и регулируемые документы — Эти документы обычно используют национально доверенные центры сертификации. Убедитесь, что цепочка сертификатов приводится к ожидаемому корневому CA, а не просто то, что подпись показывает как «действительную».
Банковские выписки и счета-фактуры — Многие из них подписываются в блоке с помощью сертификатов подписи, выданных организации. Имя подписывающего отразится как имя организации, а не как имя сотрудника.
Проверка без написания кода
Если вам нужно быстро проверить PDF-файл без настройки разработочного окружения, используйте IO Tools PDF Signature Checker позволяет загрузить файл и сразу увидеть детали подписи — удобно для одноразовой проверки или для тестирования образцов перед созданием производственной инфраструктуры.
Установите наши расширения
Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска
恵 Табло результатов прибыло!
Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!
Подписаться на новости
все Новые поступления
всеОбновлять: Наш последний инструмент was added on Май 25, 2026
