Как подписать JSON электронной подписью: гайд

Как подписать JSON электронной подписью: гайд ЭЦП и Госсервисы
Пошаговое руководство, как подписать JSON-файл электронной подписью (ЭЦП). Разбор стандартов JWS и CMS, решение частых ошибок.

Подписание JSON-документов электронной цифровой подписью (ЭЦП) — стандартная задача при интеграции государственных ИС, работе с маркировкой или EDI. В отличие от XML, где есть стандарт XMLDSig, для JSON чаще используют отсоединенную подпись PKCS#7 (CMS) или стандарт JWS (JSON Web Signature). Ниже приведена подробная инструкция, как правильно подготовить и подписать JSON-файл.

Пошаговая инструкция по подписанию JSON

Шаг 1. Канонизация (нормализация) JSON

JSON очень чувствителен к форматированию. Любые лишние пробелы, табы и переносы строк меняют хэш-сумму файла. Перед подписанием приведите JSON к единому виду: удалите лишние отступы (минифицируйте) и отсортируйте ключи по алфавиту. Сохраните готовый файл, используя сочетание клавиш Ctrl + S в кодировке UTF-8 без BOM.

Шаг 2. Подписание через КриптоПро CSP (CLI)

Для создания отсоединенной подписи (detached signature) используйте утилиту командной строки cryptcp. Откройте консоль и выполните команду:

cryptcp -signf -dir C:\\data\\ -detached -thumbprint [ОТПЕЧАТОК_СЕРТИФИКАТА] document.json

В результате рядом с файлом document.json появится файл подписи document.json.sgn.

Важно: Никогда не редактируйте JSON-файл после подписания. Любое изменение символа приведет к тому, что принимающая сторона выдаст предупреждение: Ошибка: Не совпадает хэш документа при проверке подписи.

Дополнительно: Использование стандарта JWS (JSON Web Signature)

Если вам нужно передать подпись внутри самого JSON, используйте формат JWS (RFC 7515). Он состоит из трех частей, разделенных точками: Base64Header.Base64Payload.Base64Signature. Пример структуры:

{
  "payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
  "protected": "eyJhbGciOiJSUzI1NiJ9",
  "signature": "cC4hiUPoj9Eetdgtv3hLIw"
}

Частые ошибки / Устранение неполадок

  • Ошибка: Не найден сертификат. Убедитесь, что ваш закрытый ключ установлен в систему. Если вы настраиваете серверную подпись, вам поможет Установка КриптоПро на Windows Server: пошаговый гайд.
  • Проблема с кодировкой. JSON должен быть строго в UTF-8. Если подпись создается в Windows-1251, валидация на стороне сервера провалится.
  • Интеграция с 1С. При подписании JSON-пакетов для обмена из 1С часто возникают конфликты криптопровайдеров. Рекомендуем изучить руководство: Настройка КриптоПро для 1С-Отчетности: пошаговый гайд.

Часто задаваемые вопросы

Можно ли подписать JSON встроенной подписью?

Да, для этого используется стандарт JWS (JSON Web Signature), где подпись упаковывается внутрь самого JSON-объекта.

Почему при проверке подписи JSON возникает ошибка хэша?

Чаще всего это происходит из-за изменения форматирования (пробелы, переносы строк). Перед подписью JSON нужно обязательно канонизировать.

Оцените статью
TechWork
Добавить комментарий