Команда signAndEncrypt#
Команда запускает подпись, архивирование и шифрование документов либо одну обратную операцию — проверку подписи, расшифрование или снятие подписи. Перед запуском пользователь видит обычный экран операции с файлами, сертификатами и настройками.
Содержание:
- Общая информация
- Формат ссылки
- Операции
- Получение параметров операции
- Файлы
- Параметры операции
- Параметры extra
- Сертификаты
- Подпись PDF и штамп
- Машиночитаемая доверенность
- Настройки и подтверждение
- Отправка результатов
- Справочник полей результата
- Смотрите также
Общая информация#
Команда работает с сертификатами X.509. Операции OpenPGP через внешний API недоступны.
📌 Примечание: выполнение операции требует действующей лицензии на КриптоАРМ. Временную лицензию на одну операцию можно передать в
props.license.
Формат ссылки#
Пример сетевого вызова:
Формат локального вызова описан в разделе Формат ссылки для локального вызова.
Операции#
Поле 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" } |
Если сертификата подписанта нет в хранилище пользователя, у него нет закрытого ключа или это не сертификат ГОСТ, операция не отклоняется: пользователь выбирает сертификат подписи сам.
Получатели шифрования передаются в 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 | Цепочка завершается корневым сертификатом Минцифры |
Смотрите также#
- Описание и возможности API — общий формат вызова.
- Транспорт и доверие — адреса файлов, токен, локальный вызов.
- Лимиты, статусы и ошибки — ограничения и завершение операции.
- Подпись и шифрование — те же операции в интерфейсе.