Как проверить подпись файла без подключения к интернету

Проверка цифровой подписи файла позволяет убедиться, что документ не был изменён после подписи и что подпись принадлежит заявленному лицу или организации. Иногда доступ к сети отсутствует, например, в изолированных рабочих станциях, на объектах с ограниченным интернет‑трафиком или при работе с архивными копиями. В таких случаях важно знать, какие данные необходимо иметь локально и какие инструменты позволяют выполнить проверку полностью офлайн.

Что требуется для офлайн‑проверки

Для успешной проверки подписи без интернета понадобится:

  • сам подписанный файл и его detached‑подпись (или встроенная подпись);
  • сертификат подписанта (обычно извлекается из подписи);
  • доверенные корневые сертификаты (root CA), которые вы считаете надёжными;
  • списки отзыва сертификатов (CRL) или данные OCSP, полученные заранее и сохранённые локально;
  • один из криптографических инструментов, поддерживающих проверку цепочки сертификатов и подписи (GPG, OpenSSL, signtool и др.).

Если хотя бы один из этих компонентов отсутствует или устарел, проверка может дать ложно‑положительный результат или вовсе не выполниться.

Подготовка доверенных данных

Перед началом работы необходимо собрать и поместить в отдельную папку всё, что потребуется для проверки:

  1. Корневые сертификаты (формат .crt или .pem). Их можно экспортировать из доверенного хранилища ОС (например, из certmgr.msc в Windows или из /etc/ssl/certs в Linux) и скопировать в офлайн‑медиа.
  2. Списки отзыва (CRL) для каждого промежуточного и корневого сертификата, которые вы планируете доверять. CRL обычно доступны по URL, указанному в расширении crlDistributionPoints сертификата; их следует скачать заранее и сохранить локально.
  3. При необходимости — ответы OCSP‑сервера, если вы предпочитаете проверку отзыва через OCSP вместо CRL. Ответы также можно кешировать и использовать офлайн.

Все файлы рекомендуется разместить в одной директории, например ~/offline_trust/, и указать этот путь в командах проверки.

Инструменты для офлайн‑проверки

Наиболее распространённые утилиты, работающие без сетевого доступа:

  • GnuPG (GPG) — подходит для подписей формата PGP/OpenPGP.
  • OpenSSL — универсальная криптобиблиотека, поддерживает проверку CMS/PKCS#7 подписей и X.509 сертификатов.
  • signtool (часть Windows SDK) — предназначен для проверки Authenticode‑подписей, используемых в исполняемых файлах, драйверах и установщиках Windows.
  • certutil (Windows) — может проверять цепочки сертификатов и CRL.

Выбор инструмента зависит от типа подписи, которую вы хотите проверить. Ниже приведены пошаговые инструкции для каждого из них.

Проверка подписи GPG (OpenPGP)

Если файл подписан с помощью gpg —detach-sign или подобной команды, подпись обычно хранится в отдельном файле с расширением .sig или .asc.

  1. Поместите подписанный файл и файл подписи в одну директорию.
  2. Импортируйте открытый ключ подписанта в локальное хранилище GPG, если он ещё не доверен:
    gpg —import public_key.asc
  3. Настройте уровень доверия для этого ключа (например, полное доверие):
    gpg —edit-key
    trust
    5
    y
    quit
  4. Выполните проверку:
    gpg —verify file.sig file
  5. Если вывод содержит Good signature from «Имя » и указана доверенность, подпись считается верной.

При проверке GPG автоматически использует только локально импортированные ключи и не пытается выходить в сеть, если вы не настроили использование ключевых серверов.

Проверка подписи OpenSSL (CMS/PKCS#7)

Многие файлы (например, PDF с электронной подписью, пакеты .p7s) содержат CMS‑подпись. OpenSSL позволяет извлечь сертификат и проверить подпись против цепочки trust.

  1. Извлеките сертификат подписанта из подписи (если он хранится внутри):
    openssl pkcs7 -in file.p7s -print_certs -out signer_cert.pem
  2. Проверьте саму подпись:
    openssl cms -verify -in file.p7s -inform PEM -content file -out /dev/null -CApath ~/offline_trust/
  3. Если необходимо также проверить цепочку до доверенного корня, укажите путь к папке с корневыми сертификатами и CRL:
    openssl verify -CApath ~/offline_trust/ -crl_check signer_cert.pem
  4. Успешная проверка завершится кодом возврата 0 и сообщением Verification successful.

При использовании параметра -crl_check OpenSSL ищет CRL-файлы с именами вида .r0 в указанной директории. Поэтому заранее renamed скачанные CRL подходящим образом (можно использовать c_rehash из пакета OpenSSL).

Проверка Authenticode‑подписи signtool (Windows)

Исполняемые файлы, драйверы и установщики Windows часто подписаны технологией Authenticode. Инструмент signtool.exe из Windows SDK позволяет проверить такую подпись полностью офлайн, если у вас есть локальные копии корневых сертификатов и CRL.

  1. Убедитесь, что у вас установлен Windows SDK (или Visual Studio) и доступен путь к signtool.exe (обычно C:\Program Files (x86)\Windows Kits\10\bin\\x64\signtool.exe).
  2. Поместите файл для проверки и папку с доверенными сертификатами и CRL в доступное расположение.
  3. Выполните команду:
    signtool verify /pa /v /c «path\to\offline_trust» «path\to\file.exe»
  4. Ключ /pa означает «use only the specified timestamping authority» (необязательно), /v —verbose вывод, /c —указать каталог с доверенными сертификатами и CRL.
  5. При успешной проверке вы увидите строку Successfully verified: followed by the file path.

Если требуется также проверить временную метку (timestamp), добавьте параметр /tr http://timestamp.digicert.com только если у вас есть локальная копия ответа от TSA и вы используете /td и /tp для указания локального TSA‑ответа. В чисто офлайн‑сценарии обычно проверяют только саму подпись, а метку проверяют отдельно, если она встроена.

Проверка временной метки

Многие подписи включают доверенную временную метку, которая подтверждает, что подпись существовала в определённый момент. Для офлайн‑проверки метки необходимо иметь локально сохранённый ответ от службы timestamping (TSA).

  • Извлеките метку из подписи (например, с помощью openssl ts -query -data file -out tsq.bin и затем openssl ts -reply -in tsa_response.bin -tstamp tsq.bin -out tstamp.tsr).
  • Проверьте метку против известного сертификата TSA, используя openssl ts -verify -in tstamp.tsr -CApath ~/offline_trust/ -digest sha256.
  • Если метка подтверждена, подпись считается действительной на момент её создания, даже если сертификат подписанта позднее был отозван.

Что делать, если проверка не прошла

Если любой из шагов возвращает ошибку, рассмотрите следующие причины:

  • Отсутствует или неверный доверенный корневой сертификат — проверьте, что корень, подписавший промежуточный сертификат, действительно присутствует в вашем хранилище.
  • Список отзыва устарел или отсутствует — возможно, сертификат был отозван после выпуска CRL, который вы используете. Обновите CRL вручную перед следующей проверкой.
  • Подпись повреждена или файл был изменён после подписи — проверьте целостность файла (например, сравните хеш с известным хорошим значением).
  • Неподдерживаемый алгоритм хеша или подписи — убедитесь, что ваша версия OpenSSL/GPG/signtool поддерживает используемый алгоритм (например, GOST, SHA‑2).
  • Ошибка в цепочке (отсутствует промежуточный сертификат) — извлеките все сертификаты из подписи и добавьте недостающие в промежуточный уровень trust.

После устранения проблемы повторяйте проверку с тем же набором команд.

Ограничения и рекомендации

Офлайн‑проверка подписи надёжна, если выполнены следующие условия:

  • Вы владеете актуальными копиями корневых сертификатов и списков отзыва, соответствующими тем, которые использовались при создании подписи.
  • Время на системе, где проводится проверка, синхронно с моментом подписи (для корректной работы проверки временных меток и периода действия сертификатов).
  • Вы доверяете источнику, откуда получили корневые сертификаты и CRL (например, официальный сайт издателя или внутренний PKI вашей организации).

Если хотя бы одно из этих условий не выполнено, результат проверки может быть ложно‑положительным (подпись принимается за верную, хотя на самом деле она не доверена) или ложно‑отрицательным (отказ в верной подписи из‑за отсутствия данных). Поэтому перед началом работы рекомендуется:

  1. Сформировать чек‑лист необходимых сертификатов и CRL.
  2. Проверить сроки действия каждого CRL (обычно указываются в самом файле).
  3. При возможности использовать внутренний PKI, где вы контролируете обновление доверия.
  4. Документировать версию используемых криптографических инструментов, так как изменения в поддержке алгоритмов могут влиять на результат.

Практический пример: проверка подписи PDF‑документа

Допустим, у вас есть PDF‑файл contract.pdf и встроенная подпись. Ниже показана последовательность действий с использованием OpenSSL.

  1. Извлечь подпись из PDF (можно воспользоваться pdftk или mutool, но для примера предположим, что у вас уже есть файл contract.pdf.p7s):
    mutool sign -f contract.pdf -o contract.pdf.p7s
  2. Извлечь сертификат подписанта:
    openssl pkcs7 -in contract.pdf.p7s -print_certs -out signer.pem
  3. Проверить подпись против доверенных корней (предположим, они в ~/trust/):
    openssl cms -verify -in contract.pdf.p7s -inform PEM -content contract.pdf -out /dev/null -CApath ~/trust/
  4. Если нужно проверить цепочку до корня с проверкой отзыва:
    openssl verify -CApath ~/trust/ -crl_check signer.pem

При успешном выполнении всех команд вы получите подтверждение, что подпись PDF действительна и документ не был изменён после подписи.

Выводы

Проверка цифровой подписи файла без доступа к интернету полностью возможна, если заранее подготовить необходимые доверенные данные: корневые сертификаты, списки отзыва (или OCSP‑ответы) и выбрать подходящий криптографический инструмент. Основные шаги включают извлечение сертификата подписанта, проверку самой подписи против цепочки доверия и, при необходимости, проверку временной метки. Следуя предложенным алгоритмам и учитывая ограничения, вы сможете надёжно подтверждать подлинность файлов в изолированных средах.

PEFile.ru