Задача [API71]: Подписание документов и объектов с ЭЦП

Формулировка проблемы: для реализации задач мобильного клиента необходимо реализовать методы API для подписывания документов с помощью ЭЦП.

Решение: необходимо реализовать следующие методы API:

Подписать документ

Данный метод используется для подписывания документа (кнопкой "Подписать").

URL нового метода: rest/api/docflow/sign.

Тип запроса: POST.

Метод принимает следующие строковые параметры (FormParam):

  • documentID - идентификатор подписываемого документа (обяз.);

  • rawdata - Base64 закодированные подписываемые данные (обяз.);

  • signdata - Base64 закодированная строка с подписью (обяз., если включена настройка "Требовать ключ и сертификат");

  • certificate - Base64 закодированная строка с сертификатом (обяз., если включена настройка "Требовать ключ и сертификат");

  • certID - идентификатор сертификата (обяз., если включена настройка "Требовать ключ и сертификат", получается в методе sign/verificationkey);

  • locale - локаль пользователя, ru/en/kz (не обяз., по умолчанию ru).

Пример передаваемых данных

{
documentID=23288475-1393-474a-9849-6c1d6600a0dd&
rawdata=gs65nEDW1GxiEoj22XoJ6QPwWUM%3D&
signdata=MIIOAwIBAzCCDb0GCSqGSIb3DQEHAaCC2qMIAwgAYJKoZIhvcNAQcBoIAEggW&
certificate=5qLrhfFWNcHT%2BVEMvA%2BgUvYk956seA+wgNqniukCz8TyGTv8AMo4v8aW&
certID=610466d0-cae8-11e5-b48c-001e8726c38d
}

Метод возвращает успешность (подпись документа с ЭЦП):

{
  "errorCode": 0,
  "errorMessage": "Данные сохранены"
}

либо неуспешность выполнения (errorCode != 0, errorMessage - сообщение об ошибке).

Альтернативные потоки событий.

Альтернативный поток №1. Не передан параметр documentID. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Не передан параметр documentID"
}

Альтернативный поток №2. Передан некорректный параметр documentID. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Передан некорректный параметр documentID"
}

Альтернативный поток №3. Не передан параметр rawdata. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Не передан параметр rawdata"
}

Альтернативный поток №4. При наличии требования ключа и сертификата не передан параметр signdata. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Не передан параметр signdata"
}

Альтернативный поток №5. При наличии требования ключа и сертификата и параметра signdata не передан параметр certificate. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Не передан параметр certificate"
}

Альтернативный поток №6. При наличии требования ключа и сертификата и параметра signdata не передан параметр certID. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Не передан параметр certID"
}

Альтернативный поток №7. Параметр rawdata не соответствует текущим подписываемым данным документа. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Передан некорректный параметр rawdata"
}

Альтернативный поток №8. Параметр signdata не соответствует текущим подписываемым данным документа. Сервер возвращает ошибку с сообщением:

{
  "errorCode": 13,
  "errorMessage": "Передан некорректный параметр signdata"
}

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

Аналогично, возможен вывод ошибки, если в период между получением подписываемых данных и непосредственно подписью эти самые подписываемые данные были изменены.

Подписать объект

Данный метод используется для подписывания документа при согласовании / утверждении / ознакомлении.

URL дорабатываемого метода: rest/api/workflow/finish_process.

Тип запроса: POST.

Метод принимает следующие строковые параметры (FormParam):

  • procInstID - идентификатор процесса (обяз., поле procInstID в описании работы, например из метода /rest/api/workflow/works/list/%user_id%);

  • signal - название сигнала (обяз., получается в методе rest/api/workflow/process_info);

  • comment - текст комментария (не обяз.);

    Примечание.

    Наличие данного параметра должно игнорироваться для процесса "ознакомление".

  • addSignature - необходимо ли добавить подпись (true/ false, по умолчанию false);

  • rawdata - Base64 закодированные подписываемые данные (обяз., если включена настройка "Требовать ли подпись", получаются в методе rest/api/workflow/process_info);

  • signdata - Base64 закодированная строка с подписью (обяз., если включена настройка "Требовать ключ и сертификат");

  • certificate - Base64 закодированная строка с сертификатом (обяз., если включена настройка "Требовать ключ и сертификат");

  • certID - идентификатор сертификата (обяз., если включена настройка "Требовать ключ и сертификат", получается в методе sign/verificationkey);

  • locale - локаль пользователя, ru/en/kz (не обяз., по умолчанию ru).

Пример передаваемых данных

procInstID=8f228927-2183-4fc8-9f87-b421bf63efc4&
signal=got_agree&
addSignature=true&
rawdata=74PFr9hyqFhqnsoYRAhf91qcVmU%3D&
signdata=MIIOAwIBAzCCIb3DQEHAaCCDa4Egg2qMIAwgAYJKoZIhvcNAQcBoIAEggW&
certificate=5qLrhfFWNO0G05ij%252F69956seA%2BwgNGpqniukCz8TyGTv8AMo4v8aW&
certID=610466d0-cae8-11e5-b48c-001e8726c38d

Метод возвращает успешность выполнения (завершение работы по процессу с подписью ЭЦП):

{
  "errorCode": "0",
  "errorMessage": "Данные сохранены"
}

либо неуспешность выполнения (errorCode != 0, errorMessage - сообщение об ошибке).

Альтернативные потоки событий.

Альтернативный поток №1. Тип процесса требует наличие подписи, при этом не передан параметр addSignature. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Данный тип процесса требует подписи"
}

Для дальнейших альтернативных потоков считаем, что тип процесса требует подписи и что передан параметр addSignature.

Альтернативный поток №2. Не передан параметр rawdata. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Не передан параметр rawdata"
}

Альтернативный поток №3. При наличии требования ключа и сертификата не передан параметр signdata. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Не передан параметр signdata"
}

Альтернативный поток №4. При наличии требования ключа и сертификата и параметра signdata не передан параметр certificate. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Не передан параметр certificate"
}

Альтернативный поток №5. При наличии требования ключа и сертификата и параметра signdata не передан параметр certID. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Не передан параметр certID"
}

Альтернативный поток №6. Параметр rawdata не соответствует текущим подписываемым данным документа. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Передан некорректный параметр rawdata"
}

Альтернативный поток №7. Параметр signdata не соответствует текущим подписываемым данным документа. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Передан некорректный параметр signdata"
}

Альтернативный поток №8. Параметр certificate не является сертификатом. Сервер возвращает ошибку с сообщением:

{
  "errorCode": "13",
  "errorMessage": "Передан некорректный параметр certificate"
}

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

Аналогично, возможен вывод ошибки, если в период между получением подписываемых данных и непосредственно подписью эти самые подписываемые данные были изменены.