Утилита для подписания XML-документов по стандарту XMLDSig с требованиями ГИИС ДМДК (Государственная информационная система мониторинга драгоценных металлов и драгоценных камней), используя КриптоПро CSP.
- ✅ Подписание XML-документов по стандарту XMLDSig
- ✅ Поддержка алгоритмов ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012
- ✅ Интеграция с КриптоПро CSP через COM-интерфейс
- ✅ Применение Exclusive Canonicalization (ExcC14N)
- ✅ Поддержка SMEV-трансформации для государственных систем
- ✅ GUI и CLI интерфейсы
- ✅ Standalone exe-файлы (без установки Python)
- ✅ Готов к использованию в производстве
Последний анализ: GIIS-Signer-GUI.exe на VirusTotal
- Результат: 6/72 антивирусов обнаружили потенциальные угрозы
- Детали: Просмотреть полный отчет
Exe-файлы созданы с помощью PyInstaller и содержат:
- Весь код Python приложения
- Необходимые библиотеки и зависимости
- Python runtime
Примечание: PyInstaller-сборки часто вызывают ложные срабатывания у антивирусов из-за способа упаковки исполняемых файлов. Весь исходный код открыт и доступен для проверки в этом репозитории.
Проект использует следующие специализированные библиотеки для работы с ГОСТ криптографией:
- xmlcanon - Реализация Exclusive XML Canonicalization (ExcC14N) для Python
- smev-transform - Реализация SMEV-трансформации для электронной подписи государственных документов
- giis-srv-selector - Утилита для выбора сервера ГИИС ДМДК (тестовый/продуктовый)
Все библиотеки разработаны специально для обеспечения совместимости с требованиями ГИИС ДМДК и других государственных информационных систем РФ.
- ОС: Windows (из-за зависимости от КриптоПро CSP)
- Python: >= 3.8
- КриптоПро CSP: Установлен и настроен
- КриптоПро ЭЦП Browser plug-in: Установлен (скачать)
- Сертификат: ГОСТ Р 34.10-2012 (256 бит) в хранилище сертификатов Windows
pywin32>=305- для работы с COM-интерфейсом КриптоПроlxml>=4.9.0- для обработки XML
Скачайте и установите КриптоПро CSP с официального сайта.
Также установите КриптоПро ЭЦП Browser plug-in для работы с COM-интерфейсом.
Убедитесь, что у вас установлен Python 3.8 или выше.
Установите uv package manager:
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"Или используйте pip:
pip install uv# Клонирование репозитория
git clone https://github.com/yourusername/giis-signer.git
cd giis-signer
# Создание виртуального окружения и установка зависимостей
uv venv
uv sync
uv pip install -e .Если вы скопировали папку проекта на новый компьютер:
# Перейдите в папку проекта
cd путь\к\giis-signer
# Создайте виртуальное окружение
uv venv
# Установите зависимости из lockfile
uv sync
# Установите пакет в editable режиме для регистрации entry points
uv pip install -e .Запуск GUI приложения:
# Вариант 1: Через entry point (рекомендуется)
.venv\Scripts\giis-signer-gui.exe
# Вариант 2: Через Python модуль
.venv\Scripts\python.exe -m giis_signer.gui.appЗапуск CLI:
# Вариант 1: Через entry point
.venv\Scripts\giis-signer.exe template.xml -t <thumbprint> -o signed.xml
# Вариант 2: Через Python модуль
.venv\Scripts\python.exe -m giis_signer.cli template.xml -t <thumbprint> -o signed.xmlЗапустите GUI приложение:
giis-signer-gui- ✅ Интуитивно понятный интерфейс
- ✅ Двухпанельный режим: входной XML → подписанный XML
- ✅ Импорт/экспорт XML файлов
- ✅ Копирование результата в буфер обмена
- ✅ Выбор сертификата из списка с подробной информацией
- ✅ Автосохранение последнего выбранного сертификата
- ✅ Кнопки очистки полей (по отдельности и вместе)
- ✅ Поддержка темной и светлой темы
- ✅ Сохранение размера окна и последних директорий
- ✅ Авто-определение Element ID для подписания из XML
- ✅ Возможность ручной корректировки Element ID
- ✅ Кнопка обновления Element ID (активируется при ручном изменении)
- ✅ Неблокирующие toast-уведомления вместо модальных окон
giis-signer template.xml -t c755d5b4b7e1554b632f0c989427eba47b176c3a -o signed.xmlПримечание: Element ID автоматически определяется из XML. Если не найден, используется "body".
giis-signer template.xml -s "CN=Иванов Иван Иванович" -o signed.xmlgiis-signer input.xml -t <thumbprint> -e "requestBody" -o output.xmlgiis-signer input.xml -t <thumbprint> -e "RequestBody" -n "Signature" -o output.xml| Параметр | Описание | Обязательный |
|---|---|---|
input |
Путь к входному XML-файлу (SOAP-шаблон) | ✅ Да |
-o, --output |
Путь к выходному файлу (stdout если не указан) | ❌ Нет |
-t, --thumbprint |
Отпечаток сертификата (SHA1, HEX) | -t или -s |
-s, --subject |
Имя субъекта сертификата | -t или -s |
-e, --element-id |
ID элемента для подписания (авто-определение или body) |
❌ Нет |
-n, --signature-element |
Имя элемента для вставки подписи (по умолчанию: CallerSignature) |
❌ Нет |
from giis_signer import CryptoProSigner, XMLSigner
# Инициализация подписанта
signer = CryptoProSigner(thumbprint="c755d5b4b7e1554b632f0c989427eba47b176c3a")
# Поиск сертификата
certificate = signer.find_certificate()
print(f"Найден сертификат: {certificate.SubjectName}")
# Создание XML подписанта
xml_signer = XMLSigner(signer)
# Чтение XML-шаблона
with open("template.xml", "r", encoding="utf-8") as f:
soap_xml = f.read()
# Подписание документа
signed_xml = xml_signer.sign_soap_request(
soap_xml,
element_id="body",
signature_element_name="CallerSignature"
)
# Сохранение результата
with open("signed.xml", "w", encoding="utf-8") as f:
f.write(signed_xml)Входной XML-документ должен иметь следующую структуру:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/3.0">
<soapenv:Header/>
<soapenv:Body>
<ns:SendGetContractorRequest>
<ns:CallerSignature></ns:CallerSignature>
<ns:RequestData id="body">
<ns:INN>7813252159</ns:INN>
</ns:RequestData>
</ns:SendGetContractorRequest>
</soapenv:Body>
</soapenv:Envelope>Ключевые элементы:
id="body"- элемент, который будет подписан (Element ID может быть любым)<ns:CallerSignature>- элемент, куда будет вставлена подпись
Примечание: В GUI приложении Element ID автоматически определяется из XML по паттерну <ns:RequestData id="...">. Значение можно изменить вручную перед подписанием.
- Каноникализация ExcC14N → применяется к элементу с
id="body" - SMEV-трансформация → применяется к результату каноникализации
- Хеширование ГОСТ Р 34.11-2012 → вычисление дайджеста трансформированных данных
- Формирование SignedInfo → создание метаданных подписи с DigestValue
- Каноникализация SignedInfo → применение ExcC14N к SignedInfo
- Подписание → создание подписи с помощью КриптоПро (ГОСТ Р 34.10-2012)
- Реверс подписи → обязательное требование КриптоПро CSP
- Формирование Signature → создание финальной XML-структуры с подписью
| Тип | Алгоритм | URI |
|---|---|---|
| Каноникализация | Exclusive XML Canonicalization 1.0 | http://www.w3.org/2001/10/xml-exc-c14n# |
| Трансформация | SMEV Transform | urn://smev-gov-ru/xmldsig/transform |
| Подпись | ГОСТ Р 34.10-2012 (256 бит) | urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256 |
| Хеширование | ГОСТ Р 34.11-2012 (256 бит) | urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256 |
giis-signer/
├── giis_signer/ # Основной пакет
│ ├── __init__.py # Экспорты модуля
│ ├── cli.py # CLI-интерфейс
│ ├── cryptopro_signer.py # Интеграция с КриптоПро CSP
│ ├── xml_signer.py # Формирование XMLDSig подписи
│ ├── diagnostics.py # Утилиты диагностики
│ └── gui/ # GUI приложение
│ ├── __init__.py # Инициализация модуля
│ ├── app.py # Главное окно приложения
│ ├── certificate_dialog.py # Диалог выбора сертификата
│ ├── certificate_manager.py # Менеджер сертификатов
│ ├── config.py # Конфигурация и настройки
│ └── toast.py # Toast-уведомления
├── examples/ # Примеры шаблонов
│ ├── template.xml # Базовый SOAP-шаблон
│ └── template_custom_id.xml # Шаблон с кастомным Element ID
├── docs/ # Документация
│ ├── TRANSIT.md # Актуальное состояние проекта
│ ├── CHANGELOG.md # История версий
│ ├── CRYPTOPRO_COM.md # Документация COM-интерфейса
│ ├── CLASSES.md # Структура классов
│ ├── FILES.md # Файловая структура
│ ├── TECH.md # Технический стек
│ └── Эталонный алгоритм СМЭВ3 на java.md
├── dist/ # Сборки приложения
│ ├── GIIS-Signer-GUI.exe # GUI исполняемый файл
│ ├── GIIS-Signer-CLI.exe # CLI исполняемый файл
│ └── README.txt # Инструкция для пользователей
├── giis-signer-gui.spec # Спецификация сборки GUI
├── giis-signer-cli.spec # Спецификация сборки CLI
├── giis-signer-gui.manifest # Windows manifest для GUI
├── main_logo.ico # Иконка приложения
├── main_logo.svg # Векторный логотип
├── pyproject.toml # Конфигурация проекта
├── uv.lock # Lockfile зависимостей
├── README.md # Этот файл
└── LICENSE # Лицензия MIT
python -m giis_signer.diagnostics --check-cryptoproПроверяет:
- Доступность COM-объектов КриптоПро
- Список доступных сертификатов в хранилище
# Краткая проверка
python -m giis_signer.diagnostics --check-signature signed.xml
# Полная диагностика
python -m giis_signer.diagnostics --check-signature signed.xml --fullПроверяет:
- Корректность структуры подписи
- Валидность DigestValue
- Соответствие требованиям ГИИС ДМДК
from giis_signer import check_cryptopro_available, list_certificates, check_signature
# Проверка КриптоПро
if check_cryptopro_available():
list_certificates()
# Проверка подписи
is_valid = check_signature("signed.xml", verbose=True)⚠️ DigestValue - ОБЯЗАТЕЛЬНО в формате Base64 (не HEX)⚠️ Реверс подписи - ОБЯЗАТЕЛЕН для совместимости с КриптоПро⚠️ Порядок трансформаций - ExcC14N → SMEV (не наоборот!)⚠️ Атрибут id - использовать маленькие буквы:id="body"(неIdилиID)⚠️ Форматирование - не изменяйте форматирование подписанного XML, это нарушит целостность
Windows:
- Откройте
certmgr.msc - Перейдите в "Личные" → "Сертификаты"
- Откройте нужный сертификат → вкладка "Состав"
- Найдите поле "Отпечаток" и скопируйте значение
- Удалите пробелы:
c7 55 d5 b4...→c755d5b4...
PowerShell:
Get-ChildItem Cert:\CurrentUser\My | Select-Object Subject, ThumbprintПричина: КриптоПро CSP не установлен или COM-объекты не зарегистрированы.
Решение:
- Убедитесь, что КриптоПро CSP установлен
- Перезапустите компьютер после установки
- Проверьте версию КриптоПро (требуется 4.0 или выше)
Причина: Неверный отпечаток или сертификат отсутствует в хранилище.
Решение:
- Проверьте отпечаток (без пробелов, верхний регистр)
- Убедитесь, что сертификат находится в хранилище "Личные"
- Используйте
tests/test_com.pyдля просмотра доступных сертификатов
Причина: Проблема с каноникализацией SignedInfo.
Решение:
- Убедитесь, что используется актуальная версия утилиты
- Не изменяйте форматирование подписанного XML вручную
- Проверьте соответствие шаблона требованиям ГИИС ДМДК
Приветствуются любые улучшения проекта:
- Форкните репозиторий
- Создайте ветку для изменений (
git checkout -b feature/improvement) - Зафиксируйте изменения (
git commit -am 'Add new feature') - Отправьте в репозиторий (
git push origin feature/improvement) - Создайте Pull Request
Проект распространяется под лицензией MIT.
Проект разработан для работы с ГИИС ДМДК (Государственная информационная система мониторинга драгоценных металлов и драгоценных камней).
При возникновении проблем:
- Проверьте раздел Устранение неполадок
- Изучите документацию в папке docs/
- Создайте Issue в репозитории с подробным описанием проблемы
- КриптоПро - за разработку КриптоПро CSP
- SMEV - за спецификацию SMEV-трансформации
- Сообщество разработчиков - за вклад в проект