КриптоПро в мобильном приложении¶
Удостоверяющий центр КриптоПро отвечает за управление сертификатами на электронные подписи — выдачу, проверку, отзыв, приостановку, возобновление. В настоящее время поддерживается работа с плагинами CryptoPro или RuToken для браузера Chrome.
Часть действий выполняется на уровне сервера (это обмен данными между серверами "Первой Формы" и КриптоПро), эти действия автоматизируются с помощью смартов. Часть действий выполняется на уровне клиента (это обмен данными со считывающим устройством), эти действия автоматизированы с помощью JS API.
Процесс подписания ЭП с помощью КриптоПро¶
Если в настройках подписи на переходе включена опция ЭЦП, то в пользовательском интерфейсе в момент вынесения резолюции Подписать (или аналогичной по смыслу) открывается диалог с пользователем для считывания токена сертификата ЭП.
При неудачно завершенном диалоге (пользователь закрыл диалог) резолюция по подписи в "Первой Форме" не регистрируется.
При удачно завершенном диалоге в "Первой Форме" регистрируется вынесенная резолюция. Формируется ЭП (хеш файла) записывается в соответствии с настройками подписи: ЭП может добавляться в исходный файл (если этот файл имеет формат DOCX или PDF), а может храниться в базе данных отдельно от файла. Рядом с названием подписанного файла отображается кнопка "Посмотреть хеш".
При выполнении перехода можно подписать сразу несколько документов (комплект), в этом случае подпись генерируется отдельно для каждого документа.
При удалении исходных файлов удаляются и файлы с ЭП.
Порядок настройки¶
1. Установите и настройте Диспетчер удостоверяющего центра (см. Руководство по техподдержке).
2. Привяжите УЦ к "Первой Форме"
3. Настройте рабочие места пользователей
4. Настройте подписи с включенным признаком ЭЦП на нужных переходах маршрута
5. Автоматизируйте действия с сертификатами
Привязка УЦ к "Первой Форме"¶
1. Привязка удостоверяющего центра.
В интерфейсе администратора "Первой Формы" перейдите в раздел Система — КриптоПро — Удостоверяющие центры КриптоПро. Добавьте новый удостоверяющий центр или настройте созданный ранее. Подробнее о параметрах настройки можно узнать в Справочнике по интерфейсу администратора.
2. Привязка плагина.
В интерфейсе администратора "Первой Формы" перейдите в раздел Система — КриптоПро — Выбор плагина. Выберите один из доступных плагинов и нажмите кнопку Сохранить.
Настройка рабочего места пользователя¶
1. Если вы используете носители КриптоПро, на компьютер, с которого будет происходить подписание, установите следующее ПО:
-
плагин КриптоПро (ссылка на сайт КриптоПро). Не забудьте его включить!
-
КриптоПро CSP (ссылка на сайт КриптоПро)
-
корневой сертификат удостоверяющего центра, выдавшего ЭП
2. Если вы используете носители РуТокен, на компьютер, с которого будет происходить подписание, установите следующее ПО:
-
плагин Рутокен (ссылка на сайт РуТокен). Не забудьте его включить!
-
корневой сертификат удостоверяющего центра, выдавшего ЭП
Настройка подписи в "Первой Форме"¶
1. В интерфейсе администратора откройте настройки категории, в которой вы хотите настроить подписание с помощью ЭП, и перейдите на вкладку Маршрут.
2. Откройте настройки перехода, на котором будет запрашиваться подпись, и перейдите на вкладку Подписи на переходе.
3. Добавьте подпись или используйте подпись, добавленную ранее. У подписи включите признак ЭЦП. Перейдите во вкладку Настройки ЭП(ЭЦП).
4. Выберите СКЗИ КриптоПро/РуТокен. 5. Нажмите кнопку Добавить. Настройте перечень файлов, которые будут подписаны с помощью ЭП. 6. Выберите ДП, в котором будет храниться файл для подписания, или смарт-выражение, которое будет возвращать коллекцию FileID.
ℹ️ Если выбрать Фиксированное значение, то можно подписывать только файлы, вложенные в ДП "Файл", а если выбрать Smart-выражение, то можно подписывать файлы, вложенные в ДП "Файл" или ДП "Таблица", а также файлы, вложенные в задачу.
7. Выберите ИНН юр.лица (вы можете выбрать фиксированное значение из выпадающего списка или указать смарт-выражение, которое будет возвращать ДП, ведущее к ИНН). Настройка позволяет определять юридическое лицо из сертификата сотрудника и не разрешать подписывать сертификатом одного юр.лица документы другого.
ℹ️ После выбора ИНН пользователь перед применением подписи получит ограниченный список сертификатов. Если сотруднику доступен только один сертификат, всплывающее окно с выбором не будет выводиться на экран, а доступный сертификат будет использоваться по умолчанию.
8. Если необходима проверка машиночитаемой доверенности (это доверенность в XML-формате с правом подписи сотрудника от лица компании), отметьте опцию "МЧД". Если опция "МЧД" активна, перед подписанием ЭЦП будет происходить проверка наличия МЧД у подписывающего пользователя. Если МЧД отсутствует, подпись не будет обработана.
9. Если отмечена опция "МЧД", задайте смарт-выражение для поиска машиночитаемой доверенности и файла электронной подписи SIG. В смарт-выражении должен возвращаться массив двух числовых значений : FileId XML и FileId SIG-файла.
10. Выберите вид подписи: открепленная или прикрепленная.
11. Один файл может быть подписан неограниченным количеством подписей. Для этого в каждой подписи надо выбрать один и тот же ДП типа файл в настройках ЭЦП. Для генерации файла с накоплением ЭЦП нужно в настройках всех подписей поставить галочку "Соподпись", тогда каждая последующая будет прикрепляться к предыдущей.
Действия с сертификатами¶
Выдать сертификат
Последовательность действий:
Подготовить начальные данные (smart)
-
Строку с данными о пользователе.
-
Строку с данными о сертификате.
Форматы данных см здесь.
1. Зарегистрировать пользователя (smart)
На основе начальных данных из строки XML генерируется уникальный идентификатор пользователя (RA_User_ID).
2. Создать запрос на сертификат (js)
На основе строки с данными о пользователе (RequestString) генерируется зашифрованная строка для отправки в удостоверяющий центр (Request).
3. Выдать сертификат (smart)
На основе зашифрованной строки (Request) и уникального идентификатора пользователя (RA_User_ID) отправляется запрос в удостоверяющий центр. В ответ возвращается идентификатор запроса (RequestID) и сгенерированный сертификат (Certificate).
4. Записать сертификат (js)
Другие доступные действия
Формат данных о сертификате и пользователе¶
Данные о пользователе¶
Данные о пользователе передаются в формате XML. Комбинация значений полей должна быть уникальна (чтобы обеспечить уникальность, можно в качестве одного из параметров использовать текущее время).
В общем случае структура XML и To (содержит целевые значения). Если выполняется первоначальное создание сертификата, секция From может опускаться. Если выполняется изменение данных, должны присутствовать обе секции.
<ProfileAttributesChange>
<From>
<Attribute Oid="2.5.4.3" Value="Иванов Иван Иванович"/>
<Attribute Oid="2.5.4.4" Value="Иванов"/>
<Attribute Oid="2.5.4.42" Value="Иван Иванович"/>
<Attribute Oid="1.2.840.113549.1.9.2" Value="29U6MCO"/>
<Attribute Oid="2.5.4.10" Value="ООО Ромашка"/>
<Attribute Oid="2.5.4.12" Value="Заместитель директора"/>
</From>
<To>
<Attribute Oid="2.5.4.3" Value="Иванов Иван Иванович"/>
<Attribute Oid="2.5.4.4" Value="Иванов"/>
<Attribute Oid="2.5.4.42" Value="Иван Иванович"/>
<Attribute Oid="1.2.840.113549.1.9.2" Value="29U6MCO"/>
<Attribute Oid="2.5.4.10" Value="ООО Ромашка"/>
<Attribute Oid="2.5.4.12" Value="Директор"/>
</To>
</ProfileAttributesChange>
Данные о сертификате¶
Данные о сертификате передаются в УЦ КриптоПро в следующем формате:
[
{ "rdn": "название_атрибута_RuToken", "cpn": "название_атрибута_CryptoPro", "value": "значение_атрибута" }
]
Пример:
[
{"rdn": "commonName", "cpn": "CN", "value": "ИвановИИ"},
{"rdn": "surname", "cpn": "SN", "value": "Иванов"},
{"rdn": "givenName", "cpn": "G", "value": "Иван Иванович"},
{"rdn": "organizationName", "cpn": "O", "value": "ООО Ромашка"},
{"rdn": "title", "cpn": "T", "value": "Директор"},
{"rdn": "emailAddress", "cpn": "E", "value": "ivanov@romashka.ru"},
{"rdn": "unstructuredName", "cpn": "1.2.840.113549.1.9.2", "value": "123456"}
]
SMART для работы с КриптоПро¶
CryptoPro CA - Issue certificate — Выпуск сертификата КриптоПро
| Параметр | Тип | Описание |
|---|---|---|
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП |
| ID CA* | Integer | ID удостоверяющего центра КриптоПро в "Первой Форме" |
| EP User id in CA* | Integer | ID ДП типа "Текст", который содержит GUID пользователя в УЦ |
| EP Request certificate* | Integer | ID ДП типа "Текст", который содержит строку запроса сертификата (Request) |
Пример строки запроса:
-----BEGIN NEW CERTIFICATE REQUEST-----MIIBLTCB3QIBADATMREwDwYDVQQDDAgzNzY2MjM3NDBjMBwGBiqFAwICEzASBgcqhQMCAiMBBgcqh
QMCAh4BA0MABEAHXJy2UfN+4jMY9en7TV55vMGrd6Ala7MUub8xNOFrEdJCNbysCiNanp4+24EX4csIk
YEXAybTWL2FeIC1gAcoF4wXAYJKoZIhvcNAQkOMU8wTTAcBgkrBgEEAYI3FQcEDzANBggqhQMCAi4AC
AIBATAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFEf1FX9wImxUkDqJUcLgye1Crj83MAgGBiqFAwI
CAwNBAIGaaPFnovZTcPlLOHVfzRpiK8gF0hhv+Pmj/YM27huIjW+fuLooygdJvVto9rJZZtkW/1tYaz7CWiA
OQYfSHmQ=-----END NEW CERTIFICATE REQUEST-----
| EP Request id certificate* | Integer | ID ДП типа "Текст", который содержит GUID запроса на сертификат в УЦ | | EP to write certificate* | Integer | ID ДП типа "Текст", в который должен быть записан выданный сертификат |
CryptoPro CA - new or update user — Привязка сертификата КриптоПро к новому или существующему пользователю "Первой Формы"
| Параметр | Тип | Описание |
|---|---|---|
| ID CA* | Integer | ID удостоверяющего центра КриптоПро в "Первой Форме" |
| EP user xml* | Integer | ID ДП типа "Текст", который содержит xml с данными о пользователе |
Пример XML:
<ProfileAttributesChange>
<To>
<Attribute Oid="2.5.4.3" Value="123"/>
</To>
</ProfileAttributesChange>
где 123 — GUID пользователя в "Первой Форме"
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП | | EP User id in CA* | Integer | ID ДП типа "Текст", который содержит GUID пользователя в УЦ |
ℹ️ Смарт-действие проверяет, есть ли в "Первой Форме" пользователь с таким GUID. Если есть — данные по нему обновятся, если нет — пользователь будет создан.
CryptoPro CA - pause certificate — Приостановка сертификата КриптоПро
| Параметр | Тип | Описание |
|---|---|---|
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП |
| ID CA* | Integer | ID удостоверяющего центра КриптоПро в "Первой Форме" |
| EP with base64 certificate* | String | ID ДП типа "Текст", который содержит сертификат в формате base64 |
| С* | Date | Начало периода приостановки сертификата |
| По* | Date | Окончание периода приостановки сертификата |
| Revocation reason* | String | Причина приостановки сертификата |
CryptoPro CA - resume certificate — Возобновление сертификата КриптоПро
| Параметр | Тип | Описание |
|---|---|---|
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП |
| ID CA* | Integer | ID удостоверяющего центра КриптоПро в "Первой Форме" |
| EP with base64 certificate* | Integer | ID ДП типа "Текст", который содержит сертификат в формате base64 |
CryptoPro CA - revoke certificate — Отзыв сертификата КриптоПро
| Параметр | Тип | Описание |
|---|---|---|
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП |
| ID CA* | Integer | ID удостоверяющего центра КриптоПро в "Первой Форме" |
| EP with base64 certificate* | Integer | ID ДП типа "Текст", который содержит сертификат в формате base64 |
| С* | Date | Дата, начиная с которой сертификат считается отозванным |
| Revocation reason* | String | Причина отзыва сертификата |
Get Thumbprint — Получение отпечатка подписи для сертификата КриптоПро
| Параметр | Тип | Описание |
|---|---|---|
| Task number* | 1F.Task | Номер задачи, из которой берутся/в которую записываются значения указанных ДП |
| EP with base64 certificate* | Integer | ID ДП типа "Текст", который содержит сертификат в формате base64 |
| EP Thumbprint* | Integer | ID ДП типа "Текст", который содержит отпечаток подписи |
ℹ️ Отпечаток подписи необходим для смены pin-кода для выданного сертификата. Смена pin-кода инициируется JS-функцией tcCryptoLogic.changePin(\<ID ДП, содержащего Thumbprint>).
JS API для работы с КриптоПро¶
| Метод | Что делает | Параметры | Пример вызова |
|---|---|---|---|
| tcCryptoLogic.newRequest | Создает запрос на сертификат | Номер задачи; ID ДП со строкой запроса (RequestString_EP_ID); ID ДП с запросом после обработки (Request_EP_ID); JSON вида {extParamsId:{ContainerName: 'Container_EP_ID'}}, где Container_EP_ID — ID ДП с названием носителя. Носитель хранит выданные сертификаты, название имеет вид: \\.\\модель_считывателя\\название_контейнера |
tcCryptoLogic.newRequest(window.taskId, RequestString_EP_ID, Request_EP_ID, {extParamsId:{ContainerName: 'Container_EP_ID'}}) |
| tcCryptoLogic.installCertificate | Записывает сертификат на носитель | Номер задачи; ID ДП с сертификатом CryptoPro (Certificate_EP_ID); #stepBtnUnderTaskText1312 — ID смарт-кнопки |
tcCryptoLogic.installCertificate(window.taskId, Certificate_EP_ID).then(function (response) { ... }, function (ex) { dialogs.error("Текст сообщения об ошибке"); }) |
| tcCryptoLogic.changePin | Сменяет пин-код | ID ДП с отпечатком подписи Thumbprint (при CryptoPro отпечаток получается смарт-действием Get_Thumbprint; при RuToken смарт-автоматизация не нужна) | CryptoPro: tcCryptoLogic.changePin(Thumbprint_EP_ID), где Thumbprint_EP_ID — ID ДП с отпечатком. RuToken: tcCryptoLogic.changePin() |
Пример работы с сертификатом КриптоПро¶
Действия с сертификатами выполняются вручную, с помощью настраиваемых кнопок.
Подготовка¶
-
Создать Удостоверяющий центр КриптоПро (его ID используется в настройках смарт-действий).
-
Создать две категории: категория "Пользователи" для привязки сертификатов УЦ КриптоПро к пользователям "Первой Формы" и категория "Сертификаты" для выполнения действий над этими сертификатами.
ℹ️ Для работы должен быть установлен и включен плагин КриптоПро для браузера — CryptoPro или RuToken.
Категория "Пользователи"
Категория содержит следующие ДП:
| ДП | Тип | Описание | ID ДП в данном примере |
|---|---|---|---|
| UserId | Текст | GUID пользователя в УЦ КриптоПро | 11 |
| Xml | Текст | Данные о пользователе | 22 |
Эти ДП не отображаются при создании новой задачи.
Категория "Сертификаты"
Категория содержит следующие ДП:
| ДП | Тип | Описание | ID ДП в данном примере |
|---|---|---|---|
| RequestString | Текст | Строка с запросом. В ней могут быть указаны данные о пользователе (заполнять необязательно) | 33 |
| Request | Текст | Строка запроса сертификата в УЦ КриптоПро | 44 |
| RequestId | Текст | GUID запроса на сертификат в УЦ КриптоПро | 55 |
| UserId | Текст | GUID пользователя в УЦ КриптоПро (полученный при регистрации пользователя) | 66 |
| Certificate | Текст | Полученный сертификат | 77 |
| Container | Текст | Название контейнера, хранящего сертификат | 88 |
Эти ДП не отображаются при создании новой задачи.
Автоматизация в категории "Пользователи"
Кнопка Зарегистрировать
Смарт-пакет: "Зарегистрировать пользователя" с действием "CryptoPro CA — new or update user"
Автоматизация в категории "Сертификаты"
Кнопка Создать запрос на сертификат
JavaScript выражение:
tcCryptoLogic.newRequest(window.taskId, 33, 44, {extParamsId:{ContainerName: '88'}})
где 33 — это ID ДП RequestString, 44 — ID ДП Request, а 88 — ID ДП Container
Кнопка Выдать сертификат
Смарт-пакет: "Выдать сертификат" с действием "CryptoPro CA — Issue certificate" В смарт-действии Issue certificate заполняются ДП, поэтому после него нужно обновить задачу и обновить карточку задачи.
Кнопка Записать сертификат
JavaScript выражение:
tcCryptoLogic.installCertificate(window.taskId, 77).then(function (response) { $('#stepBtnUnderTaskText1312').click(); $('#ctl00_body > div.sweet-alert.showSweetAlert.visible > div.sa-button-container > div > button').click(); }, function (ex) { dialogs.error("Запись Электронной подписи на персональную карту завершилась с ошибкой.", "Убедитесь, что Ваша карта вставлена в считыватель, и нажмите на кнопку «Записать на носитель». Если ошибка повторилась, обратитесь в Службу Поддержки"); })
где 77 — это ID ДП Certificate.
Работа в пользовательском режиме
В категории "Пользователи"
1. В ДП Xml запишите строку с данными о пользователе по образцу:
<ProfileAttributesChange><To><Attribute Oid="2.5.4.3" Value="ФИО_пользователя"/></To></ProfileAttributesChange>
(может использоваться ФИО пользователя, его ID в "Первой Форме" или другая информация).
2. Нажмите кнопку Зарегистрировать. По xml-данным пользователя будет выполнена регистрация в УЦ КриптоПро — заполнится ДП UserId, необходимый для дальнейшей работы с сертификатами.
В категории "Сертификаты"
1. Скопируйте в ДП UserId значение, полученное при регистрации (см. выше п.2 в категории "Пользователи").
2. Нажмите кнопку Создать запрос на сертификат. В ДП Request будет записана строка запроса сертификата.
3. Нажмите кнопку Выдать сертификат и следуйте указаниям программы. По окончании в ДП RequestId и Certificate будут записаны данные.
4. Нажмите кнопку Записать сертификат. Сгенерированные данные будут переданы в УЦ КриптоПро.
Другие действия¶
Если нужно автоматизировать процессы приостановки, отзыва и возобновления сертификатов, а также смены pin-кода, вы можете создать кнопки, аналогичные кнопке Выдать сертификат, но с соответствующими смарт-действиями или js-функциями.
Ошибки при работе с УЦ КриптоПро¶
1. Ошибки, возникающие при работе УЦ КриптоПро, можно посмотреть в журнале.
2. Алгоритм создания подписи и алгоритм ключа проверки подписи должны быть одинаковыми. Рекомендуется использовать ГОСТ Р 34.10-2012. Если невозможно использовать одинаковые алгоритмы, необходимо отключить контроль соответствия:
В реестре Windows в раздел HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\CC2 нужно добавить параметр DisableGostCspConformityCheck типа DWORD со значением, отличным от нуля. При эксплуатации УЦ для выпуска квалифицированных подписей этот контроль должен быть включен.