Проверка подписи PDF Что нужно знать разработчикам

Опубликовано

Большинство разработчиков сталкиваются с подписанными PDF-файлами, не понимая, что гарантирует криптографическая подпись. Вот то, что нужно знать для корректной проверки подписи PDF.

Проверка подписи PDF: что нужно знать разработчикам 1
Реклама · УДАЛИТЬ?

Большинство разработчиков работали с подписанными PDF-файлами — соглашениями, подтверждёнными банковскими выписками, правительственными формами. Но понятие «подписано» может иметь разное значение в зависимости от того, кто его объясняет. Визуальный след в ячейке подписи и криптографическая подпись, встроенная в файл, — это совершенно разные вещи. Только одна из них действительно гарантирует что-то.

В этом руководстве рассмотрены принципы работы цифровых подписей PDF, различные состояния их достоверности и способы программной проверки.

Та подпись, которую вы видите, и та, которая важна

Когда кто-то «подписывает» PDF с помощью инструмента или изображения, он просто помещает изображение подписи на страницу. Оно выглядит официально, но не обеспечивает никакой безопасности. Кто угодно может скопировать это изображение в другой документ.

Цифровая подпись — это что-то иное. Это криптографический объект, встроенный в саму структуру PDF — отделённый от любых визуальных элементов. Когда документ подписывается цифровым способом:

  1. Вычисляется хэш содержимого документа.
  2. Этот хэш шифруется с помощью приватного ключа подписывающего.
  3. Зашифрованный хэш (подпись) сохраняется в 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 позволяет загрузить файл и сразу увидеть детали подписи — удобно для одноразовой проверки или для тестирования образцов перед созданием производственной инфраструктуры.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?