Skip to content

Repository files navigation

SignService — подписание документов ЭЦП

Русский | English

Настольное приложение (C# / Avalonia UI) для подписания документов электронной подписью (ЭЦП) в формате CMS/PKCS#7 и работы с файлами подписей. Логика подписания портирована из сервиса подписания документов ReportGGE.

Скачать: готовый SignService.exe (Windows x64, .NET не требуется) — на странице Releases.

Возможности

Подписание

  • Drag & drop файлов и целых папок в окно программы, добавление через «Обзор…», пакетное подписание со статусом по каждому файлу; приём путей аргументами командной строки («Открыть с помощью»);
  • откреплённая подпись (имя.sig рядом с документом — формат госпорталов) или прикреплённая (документ внутри .sig);
  • усиленный формат CAdES-BES по умолчанию: подписанные атрибуты signing-time и signing-certificate-v2 (RFC 5035, защита от подмены сертификата); certHash для ГОСТ-2012 считается Стрибогом (собственная реализация ГОСТ Р 34.11-2012, проверенная на векторах RFC 6986);
  • штамп времени (CAdES-T) по выбору: метка доверенного времени от службы TSA (RFC 3161), адрес настраивается; для ГОСТ-подписей запрос хешируется Стрибогом;
  • ГОСТ через КриптоПро: на Windows подпись создаётся нативным CryptoAPI (CryptSignMessage) — криптопровайдер сертификата (КриптоПро CSP для ГОСТ) выполняет операцию и при необходимости запрашивает PIN-код; OID хеша подбирается по типу ключа (ГОСТ Р 34.10-2012 256/512, 34.10-2001, RSA/ECDSA);
  • в подпись вкладывается вся цепочка сертификатов (для офлайн-проверки), цепочка кешируется для пакетного подписания.

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

  • подписи других лиц объединяются с вашей в один .sig: автоматически с существующей имя.sig рядом (отключается), кнопкой «+.sig» у файла или перетаскиванием файла подписи в окно;
  • повторная подпись тем же сертификатом заменяет свою старую, а не дублирует;
  • каждая объединяемая подпись проверяется по хешу документа (messageDigest; для ГОСТ — Стрибогом): подписи под другим файлом или прежней версией исключаются автоматически с указанием подписанта;
  • входные подписи принимаются в DER/BER (включая неопределённые длины и «хвосты» файлов) и base64/PEM.

Инструменты (без создания подписи)

  • Объединить .sig… — несколько файлов подписей склеиваются в один со всеми подписантами (принимаются и прикреплённые контейнеры — документ сохраняется);
  • Извлечь из .sig… — из криптоконтейнера достаются: вложенный документ (байт-в-байт), откреплённая подпись со всеми подписантами и отдельные .sig по каждому подписанту (в имени — ФИО из сертификата);
  • Собрать контейнер… — документ упаковывается в прикреплённый .sig вместе с имеющимися подписями (обратная операция к извлечению);
  • Штамп на PDF… — копия документа с плашкой о подписании без подписи.

Доверенность (МЧД)

  • кнопка «Добавить доверенность…» — как в Контуре: выбираются файл МЧД (XML, формат EMCHD_1) и подпись руководителя (.sig; имя.xml.sig рядом подхватывается автоматически);
  • программа проверяет: подпись руководителя соответствует файлу МЧД (по хешу, для ГОСТ — Стрибогом), срок действия не истёк, представитель в МЧД совпадает с владельцем выбранного сертификата по ИНН/СНИЛС;
  • при подписании файлы МЧД (XML + .sig) копируются рядом с подписанным документом (в CMS-подпись МЧД не вкладывается — так же поступает Контур), а в визуальный штамп на PDF добавляется строка «Действует на основании МЧД № …»;
  • доверенность запоминается и перепроверяется при каждом подписании.

Визуальный штамп на PDF

  • плашка «ДОКУМЕНТ ПОДПИСАН ЭЛЕКТРОННОЙ ПОДПИСЬЮ» на последней странице: номер сертификата, владелец, срок действия, по желанию — дата подписания и логотип организации (PNG/JPEG);
  • по умолчанию подписывается оригинал, а копия «имя (со штампом).pdf» — отдельный файл без подписи, который после каждого подписания пересоздаётся со всеми подписантами итоговой подписи (безопасно при соподписании: штамп не делает подписи недействительными);
  • отдельной галочкой доступен режим «подписывать копию со штампом» (штамп до подписи) — для случаев, когда принимающая сторона требует подпись именно под штампованным документом.

Сертификаты

  • выбор из хранилища «Текущий пользователь → Личное», фильтр просроченных, выбранный сертификат запоминается;
  • сохранение сертификата на компьютер (кнопка 💾), чтобы подписывать без подключённого ключа ЭЦП:
    • «в программе» — PFX-файл под паролем, виден только SignService;
    • «в хранилище Windows» — копия ключа ставится в системное хранилище, подписывать смогут и другие программы (КриптоАРМ, браузер и т.д.); работает и для сертификата с токена (экспорт + установка одним действием);
    • программа явно предупреждает о снижении безопасности; удаление — кнопкой 🗑 (PFX затирается; из хранилища удаляются только установленные программой записи); неэкспортируемые ключи сохранить нельзя — это ограничение токена/УЦ.

Прочее

  • окно лога со всеми операциями и отметками времени;
  • окно «О программе»: версия, контакты автора, история версий, проверка обновлений;
  • автообновление: проверка новых версий на GitHub Releases при запуске (отключается) и обновление в один клик из окна «О программе» (Windows).

Требования

  • Windows 10/11 — готовый exe со страницы Releases (самодостаточный);
  • для ГОСТ-подписей — установленный КриптоПро CSP и личный сертификат;
  • сборка из исходников: .NET 8 SDK (Windows/Linux/macOS; вне Windows подписание доступно алгоритмами платформы — RSA/ECDSA, ГОСТ — только через CSP на Windows).

Сборка и запуск

dotnet build SignService.sln -c Release
dotnet run --project src/SignService
dotnet run --project tests/SignService.Tests -c Release   # тесты

Публикация самодостаточного exe:

dotnet publish src/SignService -c Release -r win-x64 --self-contained true \
  -p:PublishSingleFile=true \
  -p:IncludeNativeLibrariesForSelfExtract=true \
  -p:EnableCompressionInSingleFile=true \
  -o publish

Как пользоваться

  1. Запустите программу — в списке появятся сертификаты с закрытым ключом.
  2. Выберите сертификат и режим подписи; при необходимости включите штамп времени и/или штамп на PDF.
  3. Перетащите файлы в окно (или «Обзор…») и нажмите «Подписать» — рядом с каждым файлом появится имя.sig.
  4. Операции с готовыми подписями — в меню «Инструменты».

История изменений — в CHANGELOG.md и в окне «О программе».

Автор

Зайнуллин Марат Илгамович

Структура проекта

src/SignService/
├── Services/
│   ├── CertificateProvider.cs   # доступ к сертификатам (X509Store)
│   ├── DocumentSigner.cs        # подпись CMS/PKCS#7: ГОСТ-OID, цепочка, кеш
│   ├── NativeSign.cs            # CryptSignMessage (CryptoAPI) — ГОСТ через КриптоПро
│   ├── CadesAttributes.cs       # атрибуты CAdES-BES: signing-time, signing-cert-v2
│   ├── Streebog.cs              # ГОСТ Р 34.11-2012 для certHash (векторы RFC 6986)
│   ├── CmsMerger.cs             # объединение/разбор/сборка подписей на ASN.1
│   ├── CmsExtractor.cs          # файловые операции: извлечение, объединение, контейнер
│   ├── BerDer.cs                # нормализация BER → definite-length
│   ├── CertificateVault.cs      # сертификат на ПК: PFX и хранилище Windows
│   ├── TimestampClient.cs       # штамп времени TSA (RFC 3161) для CAdES-T
│   ├── PdfStamper.cs            # визуальный штамп на PDF (данные, дата, лого)
│   ├── UpdateService.cs         # автообновление через GitHub Releases
│   └── AppSettings.cs           # настройки (сертификат, режимы, штампы)
├── ViewModels/                  # MVVM: главное окно, файлы, сертификаты
└── Views/                       # окна: главное, пароль, подтверждение, о программе
tests/SignService.Tests/         # интеграционные тесты (запускаются в CI)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages