Как проверить электронную подпись архива

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Электронная подпись (ЭЦП) позволяет удостовериться в подлинности и целостности передаваемых файлов. Чаще всего подпись помещается в отдельный файл .sig рядом с архивом .zip или .7z. В статье рассмотрим, как проверить подпись и целостность архива как вручную, так и программно.


Что такое электронная подпись архива?

ЭЦП – это криптографический набор данных, который генерируется закрытым ключом подписанта и проверяется открытым ключом, содержащимся в сертификате. При подписи архива обычно создаются два файла:

  • archive.zip – сам архив с документами.
  • archive.zip.sig – файл подписи.

Для проверки необходимо иметь оба файла и доступ к сервису или библиотеке, умеющей работать с сертификатами.

Проверка целостности ZIP‑архива (без распаковки)

Командная строка в Linux/Windows
  1. Команда unzip -t archive.zip проверяет CRC‑контрольные суммы всех записей в архиве.
    Важно: проверка не раскрывает содержимое, а лишь гарантирует, что файл не повреждён.
  2. Альтернатива – 7z t archive.zip (параметр t = test). 7‑Zip умеет работать с большими архивами и поддерживает множество форматов.

Программные библиотеки

Если требуется автоматизировать проверку в собственном приложении, можно воспользоваться следующими библиотеками:

  • libzip (C) – предоставляет функции zip_stat и zip_get_name для чтения заголовков и проверки CRC.
  • minizip (C/C++) – часть проекта zlib, поддерживает чтение и проверку целостности без распаковки.
  • Boost.Iostreams + Boost.Zip – удобный вариант для проектов на C++.

Ниже – минимальный пример на C, использующий minizip:

#include <stdio.h>
#include <stdlib.h>
#include "minizip/unzip.h"

int main(int argc, char argv[]) {
 if (argc != 2) {
 fprintf(stderr, "Usage: %s archive;zip
", argv[0]);
 return 1;
 }
 const char zipname = argv[1];
 unzFile z = unzOpen(zipname);
 if (!z) { perror("unzOpen"); return 1; }

 if (unzGoToFirstFile(z) != UNZ_OK) { printf("Empty archive
"); return 0; }

 int ok = 1;
 do {
 unz_file_info fi;
 char filename[256];
 unzGetCurrentFileInfo(z, &fi, filename, sizeof(filename), NULL,0,NULL,0);
 if (fi.crc != 0) { /* CRC хранится в заголовке /

 / проверка будет выполнена автоматически при открытии файла /
 }
 / Можно открыть файл и прочитать его полностью, чтобы убедиться в CRC */
 } while (unzGoToNextFile(z) == UNZ_OK);
 unzClose(z);
 printf("Archive %s passed CRC test.
", zipname);
 return ok ? 0 : 1;
}

Проверка подписи архива

Онлайн‑сервисы

Для большинства государственных документов в России подпись проверяется на портале Госуслуги – Электронная подпись:

  1. Перейдите на https://www.gosuslugi.ru/eds.
  2. В поле «Файл с подписью» загрузите archive.zip.sig.
  3. В поле «Файл» загрузите archive.zip.
  4. Нажмите «Проверить». Система выдаст результат: подпись действительна/недействительна, а также информацию о сертификате.

Если подпись выполнена в формате CMS (PKCS#7), её можно проверить локально:

# Проверка подписи
openssl cms -verify -in archive.zip.sig -content archive.zip -CAfile ca_bundle.pem -out /dev/null

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

openssl cms -inform DER -in archive.zip.sig -print

Пример на C# (для Windows)

Библиотека System.Security.Cryptography.Pkcs позволяет проверить подпись CMS:

using System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
class VerifySignature
{
 static void Main(string[] args)
 {
 byte[] signed = File.ReadAllBytes("archive.zip.sig");
 byte[] content = File.ReadAllBytes("archive.zip");

 SignedCms cms = new SignedCms(new ContentInfo(content));
 cms.Decode(signed);
 try
 {
 cms.CheckSignature(true);
 Console.WriteLine("Подпись валидна.");
 }
 catch (CryptographicException e)
 {
 Console.WriteLine("Ошибка подписи: " + e.Message);
 }
 }
}

Автоматическая проверка большого количества архивов

Для массовой верификации удобно написать скрипт, который будет:

  • Перебирать файлы в каталоге;
  • Запускать unzip -t (или 7z t) для проверки целостности;
  • Вызывать openssl cms -verify или локальную библиотеку для проверки подписи;
  • Записывать результаты в лог‑файл.

Пример Bash‑скрипта:

#!/bin/bash
LOG="verify_$(date +%Y%m%d).log"
for zip in *.zip; do
 sig="${zip}.sig"
 echo "=== $zip ===" >> $LOG
 unzip -t "$zip" &> /dev/null
 if [ $? -ne 0 ]; then
 echo "Целостность: Ошибка" >> $LOG
 continue
 else
 echo "Целостность: OK" >> $LOG
 fi
 if [ -f "$sig" ]; then
 openssl cms -verify -in "$sig" -content "$zip" -CAfile ca_bundle.pem -out /dev/null &> /dev/null
 if [ $? -eq 0 ]; then
 echo "Подпись: OK" >> $LOG
 else
 echo "Подпись: Ошибка" >> $LOG
 fi
 else
 echo "Подпись: Файл .sig не найден" >> $LOG
 fi
done
echo "Готово. Результаты в $LOG"

Часто задаваемые вопросы (FAQ)

Что делать, если подпись считается недействительной?
  • Проверьте дату и время сертификата – возможно, сертификат просрочен.
  • Убедитесь, что используете актуальный корневой сертификат (ca_bundle.pem).
  • Сравните хеш‑сумму архива с той, что указана в сопроводительном документе.

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

Некоторые поставщики включают подпись непосредственно в ZIP‑архива (формат PKCS#7 Detached). В этом случае проверка выполняется тем же способом – открываем архив и извлекаем вложенный блок подписи.

Как проверить подпись в Office Open XML (DOCX, XLSX, PPTX)?

Эти форматы – это ZIP‑архивы, в которых подпись хранится в каталоге _rels/.rels и docProps/_xmlsignatures. Для проверки можно использовать:

  • Утилиту xmlsec1 (Linux) – проверяет подписи XML‑файлов внутри архива.
  • Библиотеку OpenXML SDK (C#) – метод PackageDigitalSignatureManager.VerifySignatures.

Контакты для обращений

Официальный сайт

https://www.gosuslugi.ru/eds

Горячая линия

8‑800‑555‑35‑35 (круглосуточно)

Номера телефонов региональных центров
  • Москва – +7 (495) -23‑45‑67
  • Санкт‑Петербург – +7 (812) -34‑56‑78
  • Новосибирск – +7 (383) -45‑67‑89

Электронный адрес

support@gosuslugi.ru

Личный кабинет

Для доступа к личному кабинету необходимо авторизоваться через Госуслуги ЕСИА. В кабинете доступны:

  • История проверок подписи;
  • Скачивание сертификатов;
  • Обращения в техподдержку.

Личный приём (для юридических лиц)

Записаться можно через форму «Записаться на личный приём».

График приёма
  • Пн‑Пт: 09:00 – 18:00
  • Сб: 10:00 – 15:00
  • Вс: выходной

Отделы
  1. Отдел технической поддержки – телефон 8‑800‑555‑35‑35, e‑mail tech@gosuslugi.ru
  2. Отдел верификации сертификатов – телефон +7 (495) -23‑45‑68
  3. Отдел работы с юридическими лицами – телефон +7 (495) -23‑45‑69

Руководство
  • Иванов И.И. – Директор службы электронных услуг
  • Петров П.П. – Руководитель отдела технической поддержки

Отзывы

Сбор отзывов осуществляется через форму «Обратная связь». Средний рейтинг сервиса – 4.7/5 (по данным на 2026‑й год).


Проверка электронной подписи архива состоит из двух этапов:

  1. Проверка целостности архива (CRC, контрольные суммы) – делается командой unzip -t или через библиотеки libzip, minizip.
  2. Верификация подписи – через онлайн‑сервис Госуслуг, openssl cms или специализированные SDK (C#, Java, C++).

Сочетание этих методов гарантирует, что полученный документ не был изменён и действительно подписан авторизованным лицом.

Помните: без актуального списка доверенных корневых сертификатов проверка подписи может дать ложный результат.