Как проверить наличие временной метки у подписи программы

Временная метка (timestamp) в цифровой подписи — это отметка о времени подписания, заверенная доверенным сервером. Она отвечает на ключевой вопрос: останется ли подпись действительной после того, как истечёт срок действия сертификата разработчика. Если метки нет, программа с просроченным сертификатом начнёт вызывать предупреждения системы безопасности, даже если сама подпись не была подделана. Проверить наличие метки можно за минуту — через свойства файла, утилиту signtool из Windows SDK или сторонние инструменты вроде SigCheck.

Ниже разобрано, зачем нужна временная метка, как именно её проверить разными способами и что делать, если выяснилось, что метки в подписи нет.

Зачем нужна временная метка в подписи

Цифровая подпись исполняемого файла (по стандарту Authenticode, который используется в Windows) подтверждает две вещи: кто выпустил программу и что файл не изменялся после подписания. Но у сертификата, которым ставится подпись, есть ограниченный срок действия — обычно от одного до трёх лет.

Здесь и появляется проблема. Если файл подписан сертификатом, а сертификат затем истёк, операционная система формально не может подтвердить, что подпись была поставлена до истечения срока. Без дополнительной информации подпись считается недействительной, и пользователь видит предупреждение «Неизвестный издатель» или сообщение о том, что подпись повреждена.

Временная метка решает эту задачу. В момент подписания утилита обращается к серверу штампов времени (TSA, Time Stamping Authority), получает криптографически заверенную отметку даты и встраивает её в подпись. Система безопасности, проверяя файл позже, видит: «подпись поставлена тогда-то, сертификат на тот момент был действителен» — и продолжает считать подпись корректной даже спустя годы после окончания срока сертификата.

Отсюда практический вывод: подпись без метки времени работает только пока жив сертификат. Для любого ПО с долгим жизненным циклом это серьёзный недостаток, поэтому наличие метки — один из первых признаков грамотно оформленной подписи.

Способ 1. Свойства файла в проводнике Windows

Самый быстрый способ, не требующий установки чего-либо:

  1. Щёлкните по исполняемому файлу правой кнопкой мыши и выберите «Свойства».
  2. Перейдите на вкладку «Цифровые подписи». Если вкладки нет — файл не подписан вовсе.
  3. Выберите подпись в списке и нажмите «Сведения».
  4. В открывшемся окне посмотрите строку «Дополнительная информация» (или «Сведения о подписи»). При наличии метки времени там будет указано время подписания, например «Подписано: 15 марта 2024 г. 10:32:11».
  5. Нажмите «Просмотреть сертификат»: в поле «Действителен с … по …» видно срок сертификата. Если дата подписания попадает в этот диапазон — метка работает как задумано.

Важный нюанс: сам факт отображения даты подписания ещё не всегда означает полноценную метку времени от TSA. В некоторых случаях дата берётся из локальных данных подписи. Надёжнее ориентироваться на связку двух признаков: указано точное время подписания и эта дата лежит внутри срока действия сертификата. Если в сведениях подписи время отсутствует или подпись помечена как недействительная при формально целостном файле — метки, скорее всего, нет.

Способ 2. Утилита signtool из Windows SDK

Signtool — официальная утилита Microsoft для работы с подписями Authenticode. Она входит в состав Windows SDK и даёт наиболее полную картину. Команда проверки выглядит так:

signtool verify /pa /v путь\к\файлу.exe

Расшифровка параметров: /pa задаёт политику проверки по умолчанию (Default Authenticode Policy), /v включает подробный вывод. В подробном отчёте при наличии метки времени будет блок с упоминанием countersignature (контрподписи) и данными о том, какой центр штампов времени её выдал, а также хеш-алгоритм метки.

На что смотреть в выводе:

  • Countersignature / Timestamp — сам факт наличия контрподписи метки времени;
  • Issued to / Issued by — организация, выдавшая метку (это должен быть известный центр штампов времени, например подразделения DigiCert, Sectigo, GlobalSign или Microsoft);
  • Hash algorithm — алгоритм хеширования метки; устаревший SHA-1 в старых подписях может вызывать замечания современных систем;
  • итоговая строка о результате проверки — успешно завершённая проверка означает, что цепочка сертификатов и метка подтверждены.

Если signtool сообщает об ошибке вида «No signature found» — файл не подписан. Если подпись найдена, но в отчёте нет упоминания countersignature — метки времени нет, и подпись перестанет действовать сразу после окончания срока сертификата.

Способ 3. SigCheck от Sysinternals

SigCheck — компактная консольная утилита из набора Sysinternals, не требующая установки. Базовый запуск:

sigcheck -i путь\к\файлу.exe

Ключ -i добавляет вывод данных сертификата, включая дату подписания и сведения о цепочке. Для массовой проверки папки с программами удобно использовать рекурсивный режим с маской файлов — так можно быстро пройтись по всему каталогу и увидеть, какие файлы подписаны, а какие нет.

Удобство SigCheck в том, что он показывает и статус подписи («Signed», «Unsigned», «Invalid»), и данные издателя одной строкой, что удобно для быстрой оценки перед более детальной проверкой через signtool.

Способ 4. Онлайн-сервисы анализа файлов

Если не хочется ничего устанавливать, файл можно загрузить в онлайн-сервисы, которые разбирают структуру PE-файла и показывают таблицу сертификатов, включая метку времени. Такие сервисы обычно отображают: издателя подписи, срок действия сертификата, дату и время подписания, алгоритмы хеширования.

Ограничения этого подхода очевидны: вы загружаете файл на сторонний ресурс. Для публичного дистрибутива это обычно приемлемо, но для внутреннего или конфиденциального ПО лучше пользоваться локальными инструментами. Кроме того, некоторые сервисы имеют ограничения на размер файла.

Сравнение способов проверки

Способ Что нужно Точность Когда удобен
Свойства файла Только Windows Базовая, возможна неоднозначность Быстрая разовая проверка одного файла
signtool verify Windows SDK Максимальная, официальный инструмент Детальный анализ, приёмка сборок, автоматизация
SigCheck Утилита Sysinternals Высокая Быстрая проверка и массовый обход каталогов
Онлайн-сервисы Браузер Высокая, но файл покидает компьютер Разовая проверка публичного дистрибутива

Что именно считать хорошим результатом

Проверка считается успешной, когда одновременно выполняются условия:

  • файл подписан, и подпись проходит проверку целостности;
  • в подписи присутствует контрподпись сервера штампов времени;
  • дата подписания находится внутри срока действия сертификата;
  • цепочка сертификатов, включая сертификат TSA, строится до доверенного корневого центра;
  • алгоритмы хеширования актуальны (SHA-256 и новее; SHA-1 в новых подписях считается устаревшим).

Отдельно стоит помнить про RFC 3161 — современный стандарт меток времени. Старые подписи могли использовать собственный формат метки Authenticode, новые обычно применяют RFC 3161. Оба варианта работают, но RFC 3161 сегодня предпочтителен, и его наличие — хороший знак качества подписи. Signtool в подробном режиме различает эти форматы в выводе.

Типичные ситуации и их трактовка

  • Вкладка «Цифровые подписи» отсутствует. Файл вообще не подписан. Метки времени здесь ни при чём — сначала нужен вопрос о самой подписи.
  • Подпись есть, статус «Недействительна», файл не менялся. Частый сценарий для старых программ: сертификат истёк, а метки времени не было. Подпись нельзя восстановить задним числом — нужно переподписание новым сертификатом с обязательной меткой.
  • Дата подписания вне срока сертификата, но подпись «действительна». Так бывает при наличии корректной метки времени: система принимает дату из метки, а не текущую дату. Это нормальное поведение.
  • Метка есть, но цепочка TSA не строится. Возможные причины: отключён доступ в интернет (некоторые проверки требуют загрузки промежуточных сертификатов), устаревшие корневые сертификаты в системе или проблемы на стороне центра штампов. Проверьте на другой машине с обновлённой системой.
  • Файл скачан из интернета и помечен как небезопасный независимо от подписи. Это механизм маркировки зоны (Mark of the Web), он существует отдельно от подписи и метки времени и на их наличие не влияет.

Если вы разработчик: как избежать проблемы

Для тех, кто подписывает собственное ПО, проверка наличия метки — часть контроля качества релиза. Правильная команда подписания всегда включает параметр метки времени, например /tr с адресом сервера штампов времени и /td с алгоритмом дайджеста (в терминах signtool). Пропуск этого параметра — самая частая причина подписей без метки.

Рекомендуемые практики:

  • включайте метку времени в каждую команду подписания, включая промежуточные сборки;
  • используйте RFC 3161 и алгоритм SHA-256;
  • пропишите шаг проверки signtool verify в конвейер сборки, чтобы отсутствие метки ломало релиз, а не обнаруживалось пользователями через годы;
  • имейте запасной адрес сервера штампов времени: если основной TSA недоступен в момент подписания, сборка либо должна остановиться, либо повторить попытку с резервным сервером — но не подписываться молча без метки;
  • после выпуска релиза один раз проверьте итоговый файл тем же signtool verify /pa /v и сохраните вывод как артефакт сборки.

Частые вопросы

Можно ли добавить метку времени в уже подписанный файл?

Нет. Изменить существующую подпись нельзя — любое изменение содержимого сломает хеш. Единственный путь — заново подписать файл сертификатом, который действует на момент нового подписания, обязательно с меткой времени.

Метка времени гарантирует, что файл не заражён?

Нет. Метка подтверждает лишь момент подписания и неизменность файла с этого момента. Если вредоносный код попал в программу до подписания, метка честно зафиксирует и его. Подпись и метка говорят о происхождении файла, а не о его безопасности.

Работает ли подпись без метки времени, пока сертификат действителен?

Да. Пока срок сертификата не истёк, система проверяет подпись обычным образом. Проблемы начинаются ровно в момент истечения срока — и затрагивают все копии программы, распространённые ранее.

Почему в свойствах файла дата подписания есть, а signtool ругается?

Возможные причины: неполная цепочка сертификатов на конкретной машине, устаревшие корневые сертификаты, блокировка доступа к серверам центров сертификации или использование устаревшего алгоритма хеширования. Запустите проверку на обновлённой системе и сравните результаты.

Что делать дальше

Если вы проверяете чужую программу перед установкой: откройте свойства файла, убедитесь, что подпись действительна и дата подписания попадает в срок сертификата. Для ответственного решения (корпоративное развёртывание, финансовое ПО) дополнительно прогоните файл через signtool verify /pa /v и убедитесь в наличии контрподписи метки времени.

Если вы разработчик и обнаружили, что ваши прошлые сборки подписаны без метки: планируйте перевыпуск. Как только текущий сертификат истечёт, все такие сборки начнут вызывать предупреждения. Новые релизы подписывайте строго с меткой времени и добавьте автопроверку в процесс сборки — это дешевле, чем разбираться с жалобами пользователей через два года.

PEFile.ru