{"id":31762320,"url":"https://github.com/imdeniil/giis-signer","last_synced_at":"2026-05-14T12:32:51.718Z","repository":{"id":317622099,"uuid":"1068168855","full_name":"imdeniil/giis-signer","owner":"imdeniil","description":"Утилита для подписания XML-документов по стандарту XMLDSig с требованиями ГИИС ДМДК, используя КриптоПро CSP","archived":false,"fork":false,"pushed_at":"2025-10-02T16:22:41.000Z","size":174,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-29T08:25:02.404Z","etag":null,"topics":["cryptopro","gost","russian-cryptography","smev","windows","xml-signature","xmldsig"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imdeniil.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-02T00:44:48.000Z","updated_at":"2025-10-02T16:22:45.000Z","dependencies_parsed_at":"2025-10-02T02:45:00.619Z","dependency_job_id":"d9c2619e-3049-4a81-888c-0af810a7a3b5","html_url":"https://github.com/imdeniil/giis-signer","commit_stats":null,"previous_names":["imdeniil/giis-signer"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/imdeniil/giis-signer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imdeniil%2Fgiis-signer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imdeniil%2Fgiis-signer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imdeniil%2Fgiis-signer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imdeniil%2Fgiis-signer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imdeniil","download_url":"https://codeload.github.com/imdeniil/giis-signer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imdeniil%2Fgiis-signer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33024985,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cryptopro","gost","russian-cryptography","smev","windows","xml-signature","xmldsig"],"created_at":"2025-10-09T22:18:05.222Z","updated_at":"2026-05-14T12:32:51.699Z","avatar_url":"https://github.com/imdeniil.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GIIS DМДК XML Signer\n\n[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Platform](https://img.shields.io/badge/platform-Windows-lightgrey)](https://www.microsoft.com/windows)\n\nУтилита для подписания XML-документов по стандарту XMLDSig с требованиями **ГИИС ДМДК** (Государственная информационная система мониторинга драгоценных металлов и драгоценных камней), используя **КриптоПро CSP**.\n\n## Особенности\n\n- ✅ Подписание XML-документов по стандарту **XMLDSig**\n- ✅ Поддержка алгоритмов **ГОСТ Р 34.10-2012** и **ГОСТ Р 34.11-2012**\n- ✅ Интеграция с **КриптоПро CSP** через COM-интерфейс\n- ✅ Применение **Exclusive Canonicalization (ExcC14N)**\n- ✅ Поддержка **SMEV-трансформации** для государственных систем\n- ✅ GUI и CLI интерфейсы\n- ✅ Standalone exe-файлы (без установки Python)\n- ✅ Готов к использованию в производстве\n\n## Безопасность\n\n### Анализ безопасности\n**Последний анализ:** GIIS-Signer-GUI.exe на VirusTotal\n- **Результат:** 6/72 антивирусов обнаружили потенциальные угрозы\n- **Детали:** [Просмотреть полный отчет](https://www.virustotal.com/gui/file-analysis/YzI4NTVhMTJjNGJmYTEwOTg4ZGM4NjY5M2RjMjRiZTI6MTc1OTQwMjg0Nw==)\n\nExe-файлы созданы с помощью PyInstaller и содержат:\n- Весь код Python приложения\n- Необходимые библиотеки и зависимости\n- Python runtime\n\n⚠️ **Важно:** Exe-файлы НЕ содержат и НЕ хранят закрытые ключи. Все криптографические операции выполняются через КриптоПро CSP с использованием сертификатов из хранилища Windows.\n\n**Примечание:** PyInstaller-сборки часто вызывают ложные срабатывания у антивирусов из-за способа упаковки исполняемых файлов. Весь исходный код открыт и доступен для проверки в этом репозитории.\n\n## Связанные репозитории\n\nПроект использует следующие специализированные библиотеки для работы с ГОСТ криптографией:\n\n- **[xmlcanon](https://github.com/imdeniil/xmlcanon)** - Реализация Exclusive XML Canonicalization (ExcC14N) для Python\n- **[smev-transform](https://github.com/imdeniil/smev-transform)** - Реализация SMEV-трансформации для электронной подписи государственных документов\n- **[giis-srv-selector](https://github.com/imdeniil/giis-srv-selector)** - Утилита для выбора сервера ГИИС ДМДК (тестовый/продуктовый)\n\nВсе библиотеки разработаны специально для обеспечения совместимости с требованиями ГИИС ДМДК и других государственных информационных систем РФ.\n\n## Требования\n\n### Системные требования\n- **ОС**: Windows (из-за зависимости от КриптоПро CSP)\n- **Python**: \u003e= 3.8\n- **КриптоПро CSP**: Установлен и настроен\n- **КриптоПро ЭЦП Browser plug-in**: Установлен ([скачать](https://www.cryptopro.ru/products/cades/plugin))\n- **Сертификат**: ГОСТ Р 34.10-2012 (256 бит) в хранилище сертификатов Windows\n\n### Python-зависимости\n- `pywin32\u003e=305` - для работы с COM-интерфейсом КриптоПро\n- `lxml\u003e=4.9.0` - для обработки XML\n\n## Установка\n\n### 1. Установка КриптоПро CSP\n\nСкачайте и установите [КриптоПро CSP](https://www.cryptopro.ru/products/csp/downloads) с официального сайта.\n\nТакже установите [КриптоПро ЭЦП Browser plug-in](https://www.cryptopro.ru/products/cades/plugin) для работы с COM-интерфейсом.\n\n### 2. Установка Python и uv\n\nУбедитесь, что у вас установлен Python 3.8 или выше.\n\nУстановите uv package manager:\n```powershell\n# Windows (PowerShell)\npowershell -c \"irm https://astral.sh/uv/install.ps1 | iex\"\n```\n\nИли используйте pip:\n```bash\npip install uv\n```\n\n### 3. Установка утилиты\n\n#### Вариант А: Из Git репозитория\n\n```bash\n# Клонирование репозитория\ngit clone https://github.com/yourusername/giis-signer.git\ncd giis-signer\n\n# Создание виртуального окружения и установка зависимостей\nuv venv\nuv sync\nuv pip install -e .\n```\n\n#### Вариант Б: Копирование папки на новый ПК\n\nЕсли вы скопировали папку проекта на новый компьютер:\n\n```bash\n# Перейдите в папку проекта\ncd путь\\к\\giis-signer\n\n# Создайте виртуальное окружение\nuv venv\n\n# Установите зависимости из lockfile\nuv sync\n\n# Установите пакет в editable режиме для регистрации entry points\nuv pip install -e .\n```\n\n**Запуск GUI приложения:**\n```bash\n# Вариант 1: Через entry point (рекомендуется)\n.venv\\Scripts\\giis-signer-gui.exe\n\n# Вариант 2: Через Python модуль\n.venv\\Scripts\\python.exe -m giis_signer.gui.app\n```\n\n**Запуск CLI:**\n```bash\n# Вариант 1: Через entry point\n.venv\\Scripts\\giis-signer.exe template.xml -t \u003cthumbprint\u003e -o signed.xml\n\n# Вариант 2: Через Python модуль\n.venv\\Scripts\\python.exe -m giis_signer.cli template.xml -t \u003cthumbprint\u003e -o signed.xml\n```\n\n## Использование\n\n### GUI приложение (Рекомендуется)\n\nЗапустите GUI приложение:\n\n```bash\ngiis-signer-gui\n```\n\n#### Возможности GUI:\n- ✅ Интуитивно понятный интерфейс\n- ✅ Двухпанельный режим: входной XML → подписанный XML\n- ✅ Импорт/экспорт XML файлов\n- ✅ Копирование результата в буфер обмена\n- ✅ Выбор сертификата из списка с подробной информацией\n- ✅ Автосохранение последнего выбранного сертификата\n- ✅ Кнопки очистки полей (по отдельности и вместе)\n- ✅ Поддержка темной и светлой темы\n- ✅ Сохранение размера окна и последних директорий\n- ✅ Авто-определение Element ID для подписания из XML\n- ✅ Возможность ручной корректировки Element ID\n- ✅ Кнопка обновления Element ID (активируется при ручном изменении)\n- ✅ Неблокирующие toast-уведомления вместо модальных окон\n\n### Командная строка\n\n#### Базовый пример (Element ID определяется автоматически)\n\n```bash\ngiis-signer template.xml -t c755d5b4b7e1554b632f0c989427eba47b176c3a -o signed.xml\n```\n\n**Примечание:** Element ID автоматически определяется из XML. Если не найден, используется \"body\".\n\n#### Пример с указанием субъекта сертификата\n\n```bash\ngiis-signer template.xml -s \"CN=Иванов Иван Иванович\" -o signed.xml\n```\n\n#### Пример с явным указанием Element ID\n\n```bash\ngiis-signer input.xml -t \u003cthumbprint\u003e -e \"requestBody\" -o output.xml\n```\n\n#### Пример с кастомными параметрами\n\n```bash\ngiis-signer input.xml -t \u003cthumbprint\u003e -e \"RequestBody\" -n \"Signature\" -o output.xml\n```\n\n### Параметры CLI\n\n| Параметр | Описание | Обязательный |\n|----------|----------|--------------|\n| `input` | Путь к входному XML-файлу (SOAP-шаблон) | ✅ Да |\n| `-o, --output` | Путь к выходному файлу (stdout если не указан) | ❌ Нет |\n| `-t, --thumbprint` | Отпечаток сертификата (SHA1, HEX) | ⚠️ Один из `-t` или `-s` |\n| `-s, --subject` | Имя субъекта сертификата | ⚠️ Один из `-t` или `-s` |\n| `-e, --element-id` | ID элемента для подписания (авто-определение или `body`) | ❌ Нет |\n| `-n, --signature-element` | Имя элемента для вставки подписи (по умолчанию: `CallerSignature`) | ❌ Нет |\n\n### Использование как библиотеки\n\n```python\nfrom giis_signer import CryptoProSigner, XMLSigner\n\n# Инициализация подписанта\nsigner = CryptoProSigner(thumbprint=\"c755d5b4b7e1554b632f0c989427eba47b176c3a\")\n\n# Поиск сертификата\ncertificate = signer.find_certificate()\nprint(f\"Найден сертификат: {certificate.SubjectName}\")\n\n# Создание XML подписанта\nxml_signer = XMLSigner(signer)\n\n# Чтение XML-шаблона\nwith open(\"template.xml\", \"r\", encoding=\"utf-8\") as f:\n    soap_xml = f.read()\n\n# Подписание документа\nsigned_xml = xml_signer.sign_soap_request(\n    soap_xml,\n    element_id=\"body\",\n    signature_element_name=\"CallerSignature\"\n)\n\n# Сохранение результата\nwith open(\"signed.xml\", \"w\", encoding=\"utf-8\") as f:\n    f.write(signed_xml)\n```\n\n## Формат SOAP-документа\n\nВходной XML-документ должен иметь следующую структуру:\n\n```xml\n\u003csoapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n                  xmlns:ns=\"urn://xsd.dmdk.goznak.ru/exchange/3.0\"\u003e\n   \u003csoapenv:Header/\u003e\n   \u003csoapenv:Body\u003e\n      \u003cns:SendGetContractorRequest\u003e\n        \u003cns:CallerSignature\u003e\u003c/ns:CallerSignature\u003e\n        \u003cns:RequestData id=\"body\"\u003e\n           \u003cns:INN\u003e7813252159\u003c/ns:INN\u003e\n        \u003c/ns:RequestData\u003e\n      \u003c/ns:SendGetContractorRequest\u003e\n   \u003c/soapenv:Body\u003e\n\u003c/soapenv:Envelope\u003e\n```\n\n**Ключевые элементы:**\n- `id=\"body\"` - элемент, который будет подписан (Element ID может быть любым)\n- `\u003cns:CallerSignature\u003e` - элемент, куда будет вставлена подпись\n\n**Примечание:** В GUI приложении Element ID автоматически определяется из XML по паттерну `\u003cns:RequestData id=\"...\"\u003e`. Значение можно изменить вручную перед подписанием.\n\n## Алгоритм подписания\n\n1. **Каноникализация ExcC14N** → применяется к элементу с `id=\"body\"`\n2. **SMEV-трансформация** → применяется к результату каноникализации\n3. **Хеширование ГОСТ Р 34.11-2012** → вычисление дайджеста трансформированных данных\n4. **Формирование SignedInfo** → создание метаданных подписи с DigestValue\n5. **Каноникализация SignedInfo** → применение ExcC14N к SignedInfo\n6. **Подписание** → создание подписи с помощью КриптоПро (ГОСТ Р 34.10-2012)\n7. **Реверс подписи** → обязательное требование КриптоПро CSP\n8. **Формирование Signature** → создание финальной XML-структуры с подписью\n\n## Поддерживаемые алгоритмы\n\n| Тип | Алгоритм | URI |\n|-----|----------|-----|\n| **Каноникализация** | Exclusive XML Canonicalization 1.0 | `http://www.w3.org/2001/10/xml-exc-c14n#` |\n| **Трансформация** | SMEV Transform | `urn://smev-gov-ru/xmldsig/transform` |\n| **Подпись** | ГОСТ Р 34.10-2012 (256 бит) | `urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256` |\n| **Хеширование** | ГОСТ Р 34.11-2012 (256 бит) | `urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256` |\n\n## Структура проекта\n\n```\ngiis-signer/\n├── giis_signer/               # Основной пакет\n│   ├── __init__.py            # Экспорты модуля\n│   ├── cli.py                 # CLI-интерфейс\n│   ├── cryptopro_signer.py    # Интеграция с КриптоПро CSP\n│   ├── xml_signer.py          # Формирование XMLDSig подписи\n│   ├── diagnostics.py         # Утилиты диагностики\n│   └── gui/                   # GUI приложение\n│       ├── __init__.py        # Инициализация модуля\n│       ├── app.py             # Главное окно приложения\n│       ├── certificate_dialog.py      # Диалог выбора сертификата\n│       ├── certificate_manager.py     # Менеджер сертификатов\n│       ├── config.py          # Конфигурация и настройки\n│       └── toast.py           # Toast-уведомления\n├── examples/                  # Примеры шаблонов\n│   ├── template.xml           # Базовый SOAP-шаблон\n│   └── template_custom_id.xml # Шаблон с кастомным Element ID\n├── docs/                      # Документация\n│   ├── TRANSIT.md             # Актуальное состояние проекта\n│   ├── CHANGELOG.md           # История версий\n│   ├── CRYPTOPRO_COM.md       # Документация COM-интерфейса\n│   ├── CLASSES.md             # Структура классов\n│   ├── FILES.md               # Файловая структура\n│   ├── TECH.md                # Технический стек\n│   └── Эталонный алгоритм СМЭВ3 на java.md\n├── dist/                      # Сборки приложения\n│   ├── GIIS-Signer-GUI.exe    # GUI исполняемый файл\n│   ├── GIIS-Signer-CLI.exe    # CLI исполняемый файл\n│   └── README.txt             # Инструкция для пользователей\n├── giis-signer-gui.spec       # Спецификация сборки GUI\n├── giis-signer-cli.spec       # Спецификация сборки CLI\n├── giis-signer-gui.manifest   # Windows manifest для GUI\n├── main_logo.ico              # Иконка приложения\n├── main_logo.svg              # Векторный логотип\n├── pyproject.toml             # Конфигурация проекта\n├── uv.lock                    # Lockfile зависимостей\n├── README.md                  # Этот файл\n└── LICENSE                    # Лицензия MIT\n```\n\n## Отладка и диагностика\n\n### Проверка доступности КриптоПро CSP\n\n```bash\npython -m giis_signer.diagnostics --check-cryptopro\n```\n\nПроверяет:\n- Доступность COM-объектов КриптоПро\n- Список доступных сертификатов в хранилище\n\n### Диагностика подписи\n\n```bash\n# Краткая проверка\npython -m giis_signer.diagnostics --check-signature signed.xml\n\n# Полная диагностика\npython -m giis_signer.diagnostics --check-signature signed.xml --full\n```\n\nПроверяет:\n- Корректность структуры подписи\n- Валидность DigestValue\n- Соответствие требованиям ГИИС ДМДК\n\n### Использование в коде\n\n```python\nfrom giis_signer import check_cryptopro_available, list_certificates, check_signature\n\n# Проверка КриптоПро\nif check_cryptopro_available():\n    list_certificates()\n\n# Проверка подписи\nis_valid = check_signature(\"signed.xml\", verbose=True)\n```\n\n## Известные особенности\n\n### Критические требования\n\n- ⚠️ **DigestValue** - ОБЯЗАТЕЛЬНО в формате Base64 (не HEX)\n- ⚠️ **Реверс подписи** - ОБЯЗАТЕЛЕН для совместимости с КриптоПро\n- ⚠️ **Порядок трансформаций** - ExcC14N → SMEV (не наоборот!)\n- ⚠️ **Атрибут id** - использовать маленькие буквы: `id=\"body\"` (не `Id` или `ID`)\n- ⚠️ **Форматирование** - не изменяйте форматирование подписанного XML, это нарушит целостность\n\n### Поиск отпечатка сертификата\n\n**Windows:**\n1. Откройте `certmgr.msc`\n2. Перейдите в \"Личные\" → \"Сертификаты\"\n3. Откройте нужный сертификат → вкладка \"Состав\"\n4. Найдите поле \"Отпечаток\" и скопируйте значение\n5. Удалите пробелы: `c7 55 d5 b4...` → `c755d5b4...`\n\n**PowerShell:**\n```powershell\nGet-ChildItem Cert:\\CurrentUser\\My | Select-Object Subject, Thumbprint\n```\n\n## Устранение неполадок\n\n### Ошибка: \"Недопустимая строка с указанием класса\"\n\n**Причина:** КриптоПро CSP не установлен или COM-объекты не зарегистрированы.\n\n**Решение:**\n1. Убедитесь, что КриптоПро CSP установлен\n2. Перезапустите компьютер после установки\n3. Проверьте версию КриптоПро (требуется 4.0 или выше)\n\n### Ошибка: \"Сертификат не найден\"\n\n**Причина:** Неверный отпечаток или сертификат отсутствует в хранилище.\n\n**Решение:**\n1. Проверьте отпечаток (без пробелов, верхний регистр)\n2. Убедитесь, что сертификат находится в хранилище \"Личные\"\n3. Используйте `tests/test_com.py` для просмотра доступных сертификатов\n\n### Ошибка ГИИС ДМДК: код -12 (нарушена целостность)\n\n**Причина:** Проблема с каноникализацией SignedInfo.\n\n**Решение:**\n1. Убедитесь, что используется актуальная версия утилиты\n2. Не изменяйте форматирование подписанного XML вручную\n3. Проверьте соответствие шаблона требованиям ГИИС ДМДК\n\n## Вклад в проект\n\nПриветствуются любые улучшения проекта:\n\n1. Форкните репозиторий\n2. Создайте ветку для изменений (`git checkout -b feature/improvement`)\n3. Зафиксируйте изменения (`git commit -am 'Add new feature'`)\n4. Отправьте в репозиторий (`git push origin feature/improvement`)\n5. Создайте Pull Request\n\n## Лицензия\n\nПроект распространяется под лицензией [MIT](LICENSE).\n\n## Авторы\n\nПроект разработан для работы с ГИИС ДМДК (Государственная информационная система мониторинга драгоценных металлов и драгоценных камней).\n\n## Поддержка\n\nПри возникновении проблем:\n1. Проверьте раздел [Устранение неполадок](#устранение-неполадок)\n2. Изучите документацию в папке [docs/](docs/)\n3. Создайте Issue в репозитории с подробным описанием проблемы\n\n## Благодарности\n\n- **КриптоПро** - за разработку КриптоПро CSP\n- **SMEV** - за спецификацию SMEV-трансформации\n- **Сообщество разработчиков** - за вклад в проект\n\n---\n\n**⚠️ Важно:** Утилита предназначена исключительно для легального использования в соответствии с законодательством Российской Федерации. Убедитесь, что у вас есть все необходимые права и лицензии на использование КриптоПро CSP и ГОСТ-сертификатов.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimdeniil%2Fgiis-signer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimdeniil%2Fgiis-signer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimdeniil%2Fgiis-signer/lists"}