Русский | 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 добавляется строка «Действует на основании МЧД № …»;
- доверенность запоминается и перепроверяется при каждом подписании.
- плашка «ДОКУМЕНТ ПОДПИСАН ЭЛЕКТРОННОЙ ПОДПИСЬЮ» на последней странице: номер сертификата, владелец, срок действия, по желанию — дата подписания и логотип организации (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- Запустите программу — в списке появятся сертификаты с закрытым ключом.
- Выберите сертификат и режим подписи; при необходимости включите штамп времени и/или штамп на PDF.
- Перетащите файлы в окно (или «Обзор…») и нажмите «Подписать» —
рядом с каждым файлом появится
имя.sig. - Операции с готовыми подписями — в меню «Инструменты».
История изменений — в CHANGELOG.md и в окне «О программе».
Зайнуллин Марат Илгамович
- Телефон: +7-963-694-2461
- E-mail: [email protected]
- GitHub: https://github.com/zaynullinmi
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)