GIIS DМДК XML Signer
Утилита для подписания XML-документов по стандарту XMLDSig с требованиями ГИИС ДМДК (Государственная информационная система мониторинга драгоценных металлов и драгоценных камней), используя КриптоПро CSP.
Особенности
- ✅ Подписание XML-документов по стандарту XMLDSig
- ✅ Поддержка алгоритмов ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012
- ✅ Интеграция с КриптоПро CSP через COM-интерфейс
- ✅ Применение Exclusive Canonicalization (ExcC14N)
- ✅ Поддержка SMEV-трансформации для государственных систем
- ✅ GUI и CLI интерфейсы
- ✅ Standalone exe-файлы (без установки Python)
- ✅ Готов к использованию в производстве
Безопасность
VirusTotal Анализ
Standalone exe-файлы регулярно проверяются на VirusTotal для обеспечения безопасности:
Последний анализ: GIIS-Signer-GUI.exe
- Результат: 0/72 антивирусов обнаружили угрозы
- Детали: Просмотреть полный отчет
Exe-файлы созданы с помощью PyInstaller и содержат:
- Весь код Python приложения
- Необходимые библиотеки и зависимости
- Python runtime
⚠️ Важно: Exe-файлы НЕ содержат и НЕ хранят закрытые ключи. Все криптографические операции выполняются через КриптоПро CSP с использованием сертификатов из хранилища Windows.
Связанные библиотеки
Проект использует следующие специализированные библиотеки для работы с ГОСТ криптографией:
- xmlcanon - Реализация Exclusive XML Canonicalization (ExcC14N) для Python
- smev-transform - Реализация SMEV-трансформации для электронной подписи государственных документов
Обе библиотеки разработаны специально для обеспечения совместимости с требованиями ГИИС ДМДК и других государственных информационных систем РФ.
Требования
Системные требования
- ОС: Windows (из-за зависимости от КриптоПро CSP)
- Python: >= 3.8
- КриптоПро CSP: Установлен и настроен
- КриптоПро ЭЦП Browser plug-in: Установлен (скачать)
- Сертификат: ГОСТ Р 34.10-2012 (256 бит) в хранилище сертификатов Windows
Python-зависимости
pywin32>=305- для работы с COM-интерфейсом КриптоПроlxml>=4.9.0- для обработки XML
Установка
1. Установка КриптоПро CSP
Скачайте и установите КриптоПро CSP с официального сайта.
Также установите КриптоПро ЭЦП Browser plug-in для работы с COM-интерфейсом.
2. Установка Python и uv
Убедитесь, что у вас установлен Python 3.8 или выше.
Установите uv package manager:
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Или используйте pip:
pip install uv
3. Установка утилиты
Вариант А: Из Git репозитория
# Клонирование репозитория
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 приложение (Рекомендуется)
Запустите GUI приложение:
giis-signer-gui
Возможности GUI:
- ✅ Интуитивно понятный интерфейс
- ✅ Двухпанельный режим: входной XML → подписанный XML
- ✅ Импорт/экспорт XML файлов
- ✅ Копирование результата в буфер обмена
- ✅ Выбор сертификата из списка с подробной информацией
- ✅ Автосохранение последнего выбранного сертификата
- ✅ Кнопки очистки полей (по отдельности и вместе)
- ✅ Поддержка темной и светлой темы
- ✅ Сохранение размера окна и последних директорий
- ✅ Авто-определение Element ID для подписания из XML
- ✅ Возможность ручной корректировки Element ID
- ✅ Кнопка обновления Element ID (активируется при ручном изменении)
- ✅ Неблокирующие toast-уведомления вместо модальных окон
Командная строка
Базовый пример (Element ID определяется автоматически)
giis-signer template.xml -t c755d5b4b7e1554b632f0c989427eba47b176c3a -o signed.xml
Примечание: Element ID автоматически определяется из XML. Если не найден, используется "body".
Пример с указанием субъекта сертификата
giis-signer template.xml -s "CN=Иванов Иван Иванович" -o signed.xml
Пример с явным указанием Element ID
giis-signer input.xml -t <thumbprint> -e "requestBody" -o output.xml
Пример с кастомными параметрами
giis-signer input.xml -t <thumbprint> -e "RequestBody" -n "Signature" -o output.xml
Параметры CLI
| Параметр | Описание | Обязательный |
|---|---|---|
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)
Формат SOAP-документа
Входной 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 # Утилиты диагностики
│ ├── exc_c14n_module/ # ExcC14N каноникализация
│ └── smev_transform/ # SMEV трансформация
├── examples/ # Примеры шаблонов
│ ├── template.xml # Базовый SOAP-шаблон
│ └── example_rq_1c.xml # Пример запроса 1С
├── tests/ # Тесты (пустая директория)
├── docs/ # Документация
│ ├── DEVELOPMENT.md # История разработки
│ ├── CRYPTOPRO_COM.md # Документация COM-интерфейса
│ └── SMEV.md # Описание SMEV-трансформации
├── pyproject.toml # Конфигурация проекта
├── README.md # Этот файл
└── LICENSE # Лицензия MIT
Отладка и диагностика
Проверка доступности КриптоПро CSP
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для просмотра доступных сертификатов
Ошибка ГИИС ДМДК: код -12 (нарушена целостность)
Причина: Проблема с каноникализацией 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-трансформации
- Сообщество разработчиков - за вклад в проект
⚠️ Важно: Утилита предназначена исключительно для легального использования в соответствии с законодательством Российской Федерации. Убедитесь, что у вас есть все необходимые права и лицензии на использование КриптоПро CSP и ГОСТ-сертификатов.
Release files for giis-signer 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| giis_signer-1.0.0.tar.gz | 39.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| giis_signer-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 77.5 kB
Release files / giis_signer-1.0.0.tar.gz
| Download URL | giis_signer-1.0.0.tar.gz |
|---|---|
| Size | 39.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4169a98439c20a1107340804b7f3dc547b21a052dc86fec4e589598c75e055d
|
|
BLAKE2b-256 checksum How to use checksums |
af8d96dfb818c6bb5d8fc1bcc2da7bd657108e1ef279fbccf35ccf1ea5408446
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.2
|
Release files / giis_signer-1.0.0-py3-none-any.whl
| Download URL | giis_signer-1.0.0-py3-none-any.whl |
|---|---|
| Size | 38.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3a0d96f4fcf28ee460a1930d05426951d72ebc211b55b290fc18ecafd98fd096
|
|
BLAKE2b-256 checksum How to use checksums |
41ca73bd6ef7a6f12a80c99da60858bcb052c2549fe878267f44a063d6d57bcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.2
|