Команда signAndEncrypt API КриптоАРМ — подпись и шифрование - Документация для КриптоАРМ 6
Перейти к содержанию

Команда signAndEncrypt#

Команда запускает подпись, архивирование и шифрование документов либо одну обратную операцию — проверку подписи, расшифрование или снятие подписи. Перед запуском пользователь видит обычный экран операции с файлами, сертификатами и настройками.

Содержание:


Общая информация#

Команда работает с сертификатами X.509. Операции OpenPGP через внешний API недоступны.

📌 Примечание: выполнение операции требует действующей лицензии на КриптоАРМ. Временную лицензию на одну операцию можно передать в props.license.


Формат ссылки#

cryptoarm://signAndEncrypt/<URL>?id=<id>

Пример сетевого вызова:

cryptoarm://signAndEncrypt/https://api.example.ru/cryptoarm/json?id=tx-42

Формат локального вызова описан в разделе Формат ссылки для локального вызова.


Операции#

Поле operation — непустой массив без повторов:

Прямые операции (можно комбинировать):

Значение Описание
SIGN Подпись
ARCHIVE Архивирование
ENCRYPT Шифрование

Обратные операции (выполняются по одной):

Значение Описание
UNSIGN Снятие подписи
DECRYPT Расшифрование

Проверка подписи:

Значение Описание
VERIFYSIGN Проверка подписи

Ограничения:

  • прямые и обратные операции не смешиваются;
  • VERIFYSIGN и UNSIGN выполняются только по одной;
  • отдельной операции UNZIP нет: ZIP-слой снимается вместе с проверкой или расшифрованием.

Получение параметров операции#

Формат запроса#

Получив команду, приложение отправляет на указанный адрес запрос параметров.

Ключ Значение Описание
jsonrpc 2.0 Версия протокола JSON-RPC. Всегда 2.0.
method signAndEncrypt.parameters Имя метода. Всегда signAndEncrypt.parameters.
id Идентификатор транзакции Значение параметра id из ссылки.
diagnostic Сведения о рабочем месте Поля VERSIONS, PROVIDERS и LICENSES.
{
  "jsonrpc": "2.0",
  "method": "signAndEncrypt.parameters",
  "id": "tx-42",
  "diagnostic": {
    "VERSIONS": { "csp": "5.0.13000", "cryptoarm": "1.2.0", "openssl": "3.0.13" },
    "PROVIDERS": { "GOST2012_256": true, "GOST2012_512": true, "openssl": true },
    "LICENSES": {
      "csp": { "status": true, "type": "client", "expiration": "" },
      "cryptoarm": { "status": true, "type": "Permanent", "expiration": "" }
    }
  }
}

Формат ответа#

Пример для прямых операций:

{
  "jsonrpc": "2.0",
  "id": "tx-42",
  "result": {
    "operation": ["SIGN", "ENCRYPT"],
    "props": {
      "headerText": "Подписание документов",
      "descriptionText": "Пакет документов на согласование",
      "files": [
        {
          "id": "document-1",
          "name": "document.pdf",
          "url": "https://api.example.ru/files/document.pdf"
        }
      ],
      "uploader": "https://api.example.ru/cryptoarm/result",
      "uploadMethod": "json",
      "extra": {
        "signType": 0,
        "signStandard": "cades-bes",
        "encryptAlgorithm": 0,
        "returnFiles": true
      }
    }
  }
}

Пример для проверки подписи:

{
  "jsonrpc": "2.0",
  "id": "tx-42",
  "result": {
    "operation": ["VERIFYSIGN"],
    "props": {
      "files": [
        {
          "id": "signature-1",
          "name": "document.pdf.sig",
          "url": "https://api.example.ru/files/document.pdf.sig",
          "urlDetached": "https://api.example.ru/files/document.pdf"
        }
      ],
      "uploader": "https://api.example.ru/cryptoarm/result",
      "extra": { "printReport": true }
    }
  }
}

Файлы#

Файл описывается объектом:

Поле Тип Описание
id string Идентификатор файла. Возвращается в результате и используется в multipart.
name string Имя файла.
url string Адрес файла: HTTPS для сетевого вызова, file:// — для локального.
urlDetached string Необязательное поле. Исходный документ для отсоединённой подписи.

Числовой id принимается и возвращается строкой.

Поля props.files и props.archive взаимоисключающие. В archive передаётся ZIP с входными файлами: он распаковывается до запуска операции. Результат прямой операции над archive упаковывается в ZIP, как при ARCHIVE. Идентификаторы файлов должны быть уникальны.

Если хотя бы один файл не удалось получить, вызов завершается до открытия экрана операции, и остальные файлы не обрабатываются. Сервис получает сообщение об отмене, где ErrorDescription называет файл: Input file document-2 cannot be used: ….

Для прямых операций (SIGN, ARCHIVE, ENCRYPT) оба поля можно не передавать: тогда экран операции открывается пустым, и файлы добавляет сам пользователь. Каждый добавленный файл получает новый идентификатор, и в результате приходит именно он: сопоставить результат с файлом сервиса в этом режиме нельзя. Для проверки подписи, расшифрования и снятия подписи файлы обязательны.


Параметры операции#

Поле Описание
props.headerText Заголовок операции; длиннее 40 символов сокращается
props.descriptionText Описание операции; длиннее 120 символов сокращается
props.files Массив входных файлов; без него файлы выбирает пользователь
props.archive ZIP с входными файлами вместо props.files
props.license Временная лицензия на одну операцию
props.uploader Адрес, на который отправляется результат; без него результат не отправляется
props.uploadMethod json (по умолчанию) или multipart/form-data
props.localResultParams.savePath Каталог результата; только для локального вызова
props.localResultParams.saveResultsSeparately Отдельный файл результата для каждого входного файла
props.extra Настройки операции — см. ниже

Параметры extra#

Поле Значения
signType 0 — присоединённая подпись (по умолчанию), 1 — отсоединённая
signStandard 0, cms или cades-bes (по умолчанию), 1 или cades-xlt1, 2 или cades-t, 3 или cades-a
signEncoding 0, PEM или BASE-64; 1 или DER
encryptEncoding 0, PEM или BASE-64; 1 или DER
encryptAlgorithm 0 — ГОСТ 28147-89, 1 — Магма, 2 — Кузнечик; по умолчанию выбирается по ключам получателей
signatureExtension sig (по умолчанию), p7s, sgn, sign, bin, pem
encryptionExtension enc (по умолчанию), p7m, p7e, pem
signerChainIncludeKind personal — только сертификат подписанта (по умолчанию), full — вся цепочка
timestampOnSign true вместе с CAdES-BES включает CAdES-T; при CAdES-T, XLT1 и A штамп ставится всегда
tspURL, ocspURL Адреса служб штампа времени и проверки статуса сертификата; ocspURL требует tspURL
isSignaturePades Подпись PDF в формате PAdES
isPdfCertificationSign Сертифицирующая подпись PDF
isAddStampToPdf Отдельная печатная копия PDF со штампом подписи
printReport PDF-отчёт о проверке подписи
returnFiles true (по умолчанию) — возвращать содержимое файлов результата
showSettingsBeforeOperation true (по умолчанию) открывает настройки операции, false открывает подтверждение запуска без экрана настроек
signCertificate Сертификат подписанта
encryptCertificates Сертификаты получателей
MCHD Машиночитаемая доверенность
token Токен доступа к получателю результата и к входным файлам на ресурсе исходного вызова
pin ПИН-код контейнера закрытого ключа. Хранится только в памяти операции

Числовые значения принимаются и строками: "1" равнозначно 1.

Неизвестное значение перечислимого поля — ошибка: приложение не заменяет его значением по умолчанию.


Сертификаты#

Сертификат подписанта задаётся одним из трёх способов:

Селектор Пример
Отпечаток SHA-1 { "hash": "b0a1…" }
Сам сертификат { "x509": "<DER Base64>" }
Издатель и серийный номер { "issuerName": "CN=Example CA", "serial": "01AB" }
{
  "extra": {
    "signCertificate": { "hash": "b0a1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9" }
  }
}

Если сертификата подписанта нет в хранилище пользователя, у него нет закрытого ключа или это не сертификат ГОСТ, операция не отклоняется: пользователь выбирает сертификат подписи сам.

Получатели шифрования передаются в encryptCertificates — массивом сертификатов в формате DER, закодированном в Base64. Устанавливать их пользователю не нужно: они используются в том виде, в котором их передал сервис, и в хранилище не добавляются. Сертификат УЦ получателем быть не может. Строка, которая не является сертификатом, и повторяющиеся сертификаты отклоняются.

Получатель может быть сертификатом ГОСТ или сертификатом с ключом другого алгоритма, например RSA. Если encryptAlgorithm не задан, алгоритм выбирается по ключам получателей: для ГОСТ — ГОСТ 28147-89 или алгоритм из профиля доверенного сервиса, для остальных — AES-256. Алгоритмы encryptAlgorithm относятся к ГОСТ, поэтому зашифровать с ними для получателя с ключом RSA нельзя.

Если сертификат не задан, приложение предлагает выбрать его в обычной форме операции. Переданные сервисом получатели и найденный сертификат подписанта показываются без возможности изменения.


Подпись PDF и штамп#

Оформление видимого штампа задаётся объектом PAdESStampAppearance — для подписи PAdES — и объектом signStampAppearance — для отдельной печатной копии со штампом.

Блок mockupSettings — вид штампа:

Поле Значения
elementsColor Цвет текста и рамки в формате #rrggbb
backgroundColor Цвет фона
addBackground Заливать фон. По умолчанию true
addBorders Рисовать рамку. По умолчанию true
pixelRatio Масштаб отрисовки от 0.5 до 4. По умолчанию 2
logotype Логотип: data:image/png;base64,… или data:image/jpeg;base64,…
isHiddenLogo Скрыть логотип

Блок requisitesSettings — состав реквизитов:

Поле Значения
centralDisplayType arbitrary — произвольный состав центрального блока; иначе используется состав по ГОСТ
stampTitle Заголовок вместо «Документ подписан электронной подписью»; перенос строки делит его на две
central Реквизиты центрального блока
left, right Реквизиты боковых блоков
position left, right или leftAndRight

Элемент списка реквизитов: { "dataKey": "…", "isEnabled": true, "editedValue": "…", "title": "…" }. Отключённые и повторяющиеся реквизиты отбрасываются. Доступные значения dataKey: serialNumber, validityTimeSpan, subjectFriendlyName, individual, jobPosition, issuerFriendlyName, organizationName, mark, description, location, signingTime, MCHDNumber, hash, signatureAlgorithm.

Размещение штампа для PAdES задаётся объектом signStampPAdES:

Поле Значения
pagesSelection all, last или some
pageNumbers Массив номеров страниц; обязателен при some
isDisplayedOnAllPages Показывать штамп на всех страницах
pdfMarkedArea.stampSize width и height штампа в пунктах PDF
pdfMarkedArea.dimensionsDocument width, height, horizontalPadding, verticalPadding
pdfMarkedArea.placementOnPage horizontal: left, center, right; vertical: top, center, bottom
pdfMarkedArea.orientationDegrees Поворот: 0, 90, 180 или 270

Для печатной копии страницы задаются внутри signStampAppearance: pageSelection и строка pageNumbers вида "1,3-5".

Устаревший способ размещения signStampPosition с полями width, height, horizontalPadding и verticalPadding также принимается; его значения задаются в миллиметрах, тогда как размеры в signStampPAdES — в пунктах PDF. По умолчанию штамп имеет размер 102,3 × 39,16 мм и отступы 66,6 мм по горизонтали и 20 мм по вертикали.

Недопустимые размеры, выбор страниц, поворот и размещение возвращают ошибку и не заменяются значениями по умолчанию. Значения по умолчанию подставляются только для декоративных полей — цвета, логотипа и масштаба.


Машиночитаемая доверенность#

МЧД передаётся в extra.MCHD вместе с отсоединёнными подписями:

{
  "MCHD": {
    "xml": {
      "id": "mchd",
      "name": "power.xml",
      "url": "https://api.example.ru/files/power.xml"
    },
    "signatures": [
      {
        "id": "mchd-sign",
        "name": "power.xml.sig",
        "url": "https://api.example.ru/files/power.xml.sig"
      }
    ]
  }
}

Требуется файл XML и хотя бы одна подпись; идентификаторы всех файлов МЧД должны быть уникальны.


Настройки и подтверждение#

Явно переданные через API тип и стандарт подписи, кодировки, расширения файлов, алгоритм шифрования, параметры PAdES и МЧД и сертификаты заблокированы для изменения. Если параметр не передан, начальное значение берётся из профиля сервиса, и пользователь может его изменить.

Состав операций, входные файлы и назначение результата задаются транзакцией API и не редактируются. Значение showSettingsBeforeOperation: false пропускает экран настроек, но не подтверждение запуска.


Отправка результатов#

Прямые и обратные операции#

Результат отправляется методом signAndEncrypt.outDirectResults.

Ключ Значение Описание
jsonrpc 2.0 Версия протокола JSON-RPC. Всегда 2.0.
method signAndEncrypt.outDirectResults Имя метода
params Объект результата Идентификатор транзакции, статус и список файлов
{
  "jsonrpc": "2.0",
  "method": "signAndEncrypt.outDirectResults",
  "params": {
    "id": "tx-42",
    "status": "Completed",
    "directResults": [
      {
        "id": "document-1",
        "out": "<Base64>",
        "signValid": true,
        "signers": [
          {
            "isValid": true,
            "signingTime": 1594209848000,
            "isDetached": true,
            "signerCertificate": {
              "hash": "b0a1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9",
              "subjectName": "CN=Example User",
              "status": true
            }
          }
        ]
      }
    ]
  }
}

После подписи приложение проверяет получившуюся подпись и возвращает её сведения в полях signValid и signers — в том же виде, что и при проверке подписи. Результат SIGN вместе с ENCRYPT не проверяется: он зашифрован для получателя. Если проверка не выполнилась, результат отправляется без этих полей; недействительная по итогам проверки подпись результат не отменяет.

Необработанные файлы#

Если подпись, шифрование, архивирование, расшифрование или снятие подписи не выполнены хотя бы для одного файла, результаты на uploader не отправляются. Так сервис не получит пустой файл вместо необработанного.

Вместо результатов сервис получает сообщение об отмене на адрес, с которого получены параметры:

{
  "jsonrpc": "2.0",
  "method": "signAndEncrypt.outDirectResults",
  "id": "tx-42",
  "params": {
    "status": "Canceled",
    "Error": true,
    "ErrorDescription": "Operation failed for files: document-2 (x509.sign.failed)"
  }
}

Для локального вызова сообщение сохраняется туда же, куда сохранился бы результат. Проверки подписи это не касается: её результат отправляется и тогда, когда часть файлов проверить не удалось.

Проверка подписи#

Результат проверки отправляется методом signAndEncrypt.verifySignResults в поле verifySignResults. Содержимое файлов при проверке не возвращается: вместо него передаются сведения о подписи, а при printReport: true — PDF-отчёт в поле outReport.

{
  "jsonrpc": "2.0",
  "method": "signAndEncrypt.verifySignResults",
  "params": {
    "id": "tx-42",
    "status": "Completed",
    "verifySignResults": [
      {
        "id": "signature-1",
        "signValid": false,
        "isSignaturePades": false,
        "signers": [
          {
            "isValid": false,
            "isDetached": true,
            "isCades": true,
            "cadesType": 1,
            "signingTime": 1594209848000,
            "signatureAlgorithm": "1.2.643.7.1.1.3.2",
            "signatureDigestAlgorithm": "1.2.643.7.1.1.2.2",
            "signerCertificate": {
              "hash": "b0a1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9",
              "issuerFriendlyName": "Example CA",
              "issuerName": "CN=Example CA",
              "subjectFriendlyName": "Example User",
              "subjectName": "CN=Example User",
              "status": true,
              "serial": "01AB",
              "notBefore": 1593603200000,
              "notAfter": 1725139200000
            }
          }
        ]
      }
    ]
  }
}

💡 Примечание: недействительная подпись — это результат проверки, а не ошибка. Конверт имеет status: "Completed", а signValid и signers[].isValid — значение false.

Передача файлов#

При uploadMethod: "json" и returnFiles: true содержимое файлов передаётся в поле out в Base64. Base64 увеличивает объём передачи примерно на треть, поэтому для больших результатов используйте multipart/form-data или returnFiles: false.

При uploadMethod: "multipart/form-data" конверт JSON передаётся в поле operation-response, а файлы — отдельными частями, имя каждой части равно идентификатору исходного файла. Отчёт о проверке и печатная копия со штампом остаются полями конверта в Base64.

Значение returnFiles: false оставляет метаданные результата без содержимого файлов.

Сохранение результата локально#

Для локального вызова файлы результата — подписанные, зашифрованные, расшифрованные — сохраняются на диск:

  • в каталог из props.uploader (file:// или обычный путь), если он задан;
  • иначе — рядом с исходными файлами, для архива — рядом с архивом.

Файл JSON с результатом записывается в тот же каталог props.uploader либо в каталог props.localResultParams.savePath. Содержимого файлов в нём нет — поля out, outSignStamp и outReport не передаются, а файлы берутся с диска; name называет файл результата. Имена файлов JSON:

Операция Имя файла
Прямая и обратная direct-result-<id>.json
Проверка подписи verify-result-<id>.json

При saveResultsSeparately: true для каждого входного файла создаётся отдельный файл direct-result-<id>-<fileId>.json. Существующие файлы не перезаписываются: к имени добавляется порядковый номер.

Без получателя результата#

Если задан props.uploader, после успешной отправки результата вкладка операции закрывается; исключение — VERIFYSIGN, результат проверки остаётся на экране.

Если не заданы ни props.uploader, ни props.localResultParams.savePath, результат никуда не отправляется и остаётся у пользователя: экран операции открывается как обычно, а после завершения вкладка не закрывается. Сервис в этом режиме не получает ни результата, ни уведомления об успехе. Об ошибке сообщение уходит, как обычно, — см. Ошибки и отмена.


Справочник полей результата#

Объект результата файла#

Поле Тип Описание
id string Идентификатор входного файла
name string Имя файла результата
out string Содержимое результата в Base64
outReport string PDF-отчёт о проверке подписи в Base64
outSignStamp string Печатная копия PDF со штампом в Base64
signValid boolean Все подписи файла действительны
timestampValid boolean Штамп времени действителен
isSignaturePades boolean Подпись встроена в PDF
signers Object[] Сведения о подписантах
error string Код ошибки для этого файла

Статус подписанта#

Поле Тип Описание
isValid boolean Подпись действительна
signingTime number Время подписания, Unix-время в миллисекундах
verifyingTime number Время проверки, Unix-время в миллисекундах
isDetached boolean Отсоединённая подпись
isCades boolean Подпись в формате CAdES
cadesType number Тип CAdES
isSignaturePades boolean Подпись встроена в PDF
signatureAlgorithm string Идентификатор алгоритма подписи
signatureDigestAlgorithm string Идентификатор алгоритма хеширования
signerCertificate Object Сертификат подписанта

Сертификат подписанта#

Поле Тип Описание
hash string Отпечаток сертификата SHA-1
issuerName string Издатель
issuerFriendlyName string Издатель в удобочитаемом виде
subjectName string Владелец
subjectFriendlyName string Владелец в удобочитаемом виде
serial string Серийный номер
status boolean Результат проверки сертификата
provider string Криптопровайдер
notBefore number Начало срока действия, Unix-время в миллисекундах
notAfter number Окончание срока действия, Unix-время в миллисекундах
rootCAMinComSvyaz boolean Цепочка завершается корневым сертификатом Минцифры

Смотрите также#

Для повышения удобства работы и хранения данных веб-сайт CRYPTOARM.RU использует файлы COOKIE. Продолжая работу с веб-сайтом, Вы даете свое согласие на работу с этими файлами.