Подписание 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 нужно обязательно канонизировать.








