Утилита для подписания XML-документов по стандарту XMLDSig с требованиями ГИИС ДМДК, используя КриптоПро CSP
Project description
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 и ГОСТ-сертификатов.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file giis_signer-1.0.0.tar.gz.
File metadata
- Download URL: giis_signer-1.0.0.tar.gz
- Upload date:
- Size: 39.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4169a98439c20a1107340804b7f3dc547b21a052dc86fec4e589598c75e055d
|
|
| MD5 |
87b998b073619a67a9ca68cbfe2de7ae
|
|
| BLAKE2b-256 |
af8d96dfb818c6bb5d8fc1bcc2da7bd657108e1ef279fbccf35ccf1ea5408446
|
File details
Details for the file giis_signer-1.0.0-py3-none-any.whl.
File metadata
- Download URL: giis_signer-1.0.0-py3-none-any.whl
- Upload date:
- Size: 38.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a0d96f4fcf28ee460a1930d05426951d72ebc211b55b290fc18ecafd98fd096
|
|
| MD5 |
ee4514eebb7fcbbbca6ae9d6703829b6
|
|
| BLAKE2b-256 |
41ca73bd6ef7a6f12a80c99da60858bcb052c2549fe878267f44a063d6d57bcd
|